5

treeSetにデータを追加すると、ほとんどすべてのデータが失われました。セットの最初の要素しかないようです。

私はコード最適化のためにこの質問HashsetvsTreesetを読み、それらのようなことをしようとしました。しかし、私は本当に成功しませんでした。

入力:

int iValue = 0;

    HashSet<TagResult> results = new HashSet<TagResult>();
    for(Document doc : docs) {
        NodeList nList = doc.getElementsByTagName("TEXT");

        for (int temp = 0; temp < nList.getLength(); temp++) {
            Node nNode = nList.item(temp);
            if (nNode.getNodeType() == Node.ELEMENT_NODE) {
                Element eElement = (Element) nNode;
                iValue = searchWords.searchOnTag(eElement, szSearch);
                if(iValue > 0) {
                    results.add(new TagResult(eElement, iValue));
                }
            }
        }
    }
    System.out.println("Set :\n-------------------------");
    for(TagResult result : results) {
        System.out.println(getTagValue("Tag",result.getElement()));
    }
    Set<TagResult> sortedResult = new TreeSet<TagResult>(new Comparator<TagResult>() {

        public int compare(TagResult e1, TagResult e2) {
            return e2.getValue() - e1.getValue();
        }
    });

    sortedResult.addAll(results);

    System.out.println("Sorted Result :\n-------------------------");
    for(TagResult result : sortedResult) {
        System.out.println(getTagValue("Tag",result.getElement()));
}

実行結果は私にそれを与えます:

出力

セットする :

TXT_KEY_RELIGION_POSITIF_MEDIAN_05
TXT_KEY_RELIGION_POSITIF_MEDIAN_02
TXT_KEY_RELIGION_POSITIF_04
TXT_KEY_RELIGION_POSITIF_06
TXT_KEY_RELIGION_POSITIF_05
TXT_KEY_RELIGION_POSITIF_03
TXT_KEY_RELIGION_POSITIF_MEDIAN_06
TXT_KEY_RELIGION_POSITIF_MEDIAN_01
TXT_KEY_RELIGION_POSITIF_MEDIAN_04
TXT_KEY_RELIGION_POSITIF_MEDIAN_08
TXT_KEY_RELIGION_POSITIF_MEDIAN_03
TXT_KEY_RELIGION_POSITIF_02
TXT_KEY_RELIGION_POSITIF_07
TXT_KEY_RELIGION_POSITIF_01
TXT_KEY_RELIGION_POSITIF_MEDIAN_09
TXT_KEY_RELIGION_POSITIF_MEDIAN_07

ソートされた結果:

TXT_KEY_RELIGION_POSITIF_MEDIAN_05

なぜこの問題があるのか​​わかりません。

4

1 に答える 1

10

私はそれを想像するだろう

e2.getValue() - e1.getValue();

等しいと見なされるセット内のすべてのアイテムに対して 0 を返します。tag.getValue()タグを印刷してみて、そうであるかどうかを確認してください。

TreeSetjavadocからの抽出(強調鉱山):

Set インタフェースを正しく実装するためには、(明示的なコンパレータが提供されているかどうかに関係なく) セットによって維持される順序付けが equals と一致している必要があることに注意してください。(equals との整合性の正確な定義については、Comparable または Comparator を参照してください。) これは、Set インターフェースが equals 操作に関して定義されているためですが、TreeSet インスタンスはその compareTo (または比較) メソッドを使用してすべての要素の比較を実行するためです。このメソッドによって等しいと見なされる要素は、セットの観点からは equalです。セットの動作は、その順序付けが equals と一致しない場合でも明確に定義されています。Set インターフェースの一般的な契約に従わないだけです。

于 2012-04-30T08:52:13.093 に答える