1

次のコードは、キーではなく値でソートするソート済みセットを作成します。vertexRank値の取得を担当するオブジェクトです。コード以外はvertexCentralities.addAll(vMap.entrySet());すべて正常に動作します。すべてのエントリではなく、vMap からの最初のエントリのみが vertexCentralities に追加されます。

  1. vMap から vertexCentralities にすべてのエントリを取得するにはどうすればよいですか?

    SortedSet<Map.Entry<String, Double>> vertexCentralities = 
            new TreeSet<Map.Entry<String, Double>>(
            new Comparator<Map.Entry<String, Double>>()
            {
               @Override
               public int compare(Map.Entry<String, Double> e1, Map.Entry<String, Double> e2)
               {
                   return e2.getValue().compareTo(e1.getValue());
               }
             });
    SortedMap<String, Double> vMap = new TreeMap<String, Double>();
    double curRank = 0;
    for(String vStr: g.getVertices())
    {
        curRank = vertexRank.getVertexScore(vStr);
        vMap.put(vStr, curRank);
    }
    
    vertexCentralities.addAll(vMap.entrySet());
    
4

2 に答える 2

4

実行してみました:

public static final void main(final String[] args) {
    final String[] vStrs = new String[] { "A", "Z", "E", "R", "T", "Y" }; // init

    final SortedSet<Map.Entry<String, Double>> vertexCentralities = new TreeSet<Map.Entry<String, Double>>(new Comparator<Map.Entry<String, Double>>() {
        @Override
        public int compare(final Map.Entry<String, Double> e1, final Map.Entry<String, Double> e2) {
            return e2.getValue().compareTo(e1.getValue());
        }
    });
    final SortedMap<String, Double> vMap = new TreeMap<String, Double>();
    double curRank = 0;
    for (final String vStr : vStrs) {
        curRank = new Random().nextDouble() * 100.0; // replacing
                                                        // vertexRank.getVertexScore(vStr);
                                                        // for testing
        vMap.put(vStr, curRank);
    }
    vertexCentralities.addAll(vMap.entrySet());

    for (final Map.Entry<String, Double> entry : vertexCentralities) {
        System.out.println(entry.getKey() + ": " + entry.getValue());
    }

}

出力は値でソートされました:

A: 70.50008784770233
Z: 55.48252329485239
E: 37.31308600830347
Y: 32.534528844628255
T: 16.544965680467794
R: 12.258316023552872

たぶんあなたの問題はどこか別の場所から来ていますg.getVertices()...vertexRank.getVertexScore(vStr)

編集: と の重複値を試しStringましたdouble:

final String[] vStrs = new String[] { "A", "Z", "E", "R", "T", "Y", "A" };
curRank = new Random().nextInt(3);

重複は許可されていないようです。これはあなたの問題ですか?

EDIT:同じもので複数のエントリを許可したい場合の解決策を見つけました:あなたのコンパレータ条件を次のようにDouble置き換えます:SortedSet vertexCentralities

final int bValue = e2.getValue().compareTo(e1.getValue());
return bValue != 0 ? bValue : e2.getKey().compareTo(e1.getKey());
于 2012-12-06T08:39:10.590 に答える
0

別の解決策は、SimpleEntry<K, V>(java.util.AbstractMapの内部パブリック静的クラス)を使用して、SortedMapを回避することです。

final SortedSet<Map.Entry<String, Double>> vertexCentralities = new TreeSet<Map.Entry<String, Double>>(new Comparator<Map.Entry<String, Double>>() {
    @Override
    public int compare(final Map.Entry<String, Double> e1, final Map.Entry<String, Double> e2) {
        final int bValue = e2.getValue().compareTo(e1.getValue());
        return bValue != 0 ? bValue : e2.getKey().compareTo(e1.getKey());
    }
});
double curRank = 0;
for (final String vStr : g.getVertices()) {
    curRank = vertexRank.getVertexScore(vStr);
    vertexCentralities.add(new SimpleEntry<String, Double>(vStr, curRank));
}

あなたは重複することができるはずですKeyValue、両方を持つことはできません。

于 2012-12-06T09:27:58.333 に答える