TreeSet和HashSet中的addAll如何工作?

M07*_*M07 5 java hashset treeset

当我在treeSet上添加我的数据时,几乎丢失了所有数据.似乎我只有我的第一个元素.

我读了这个问题Hashset vs Treeset进行代码优化,我尝试做类似的事情.但我并没有真正成功.

输入:

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()));
}
Run Code Online (Sandbox Code Playgroud)

执行结果给我:

产量

设置:

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
Run Code Online (Sandbox Code Playgroud)

排序结果:

TXT_KEY_RELIGION_POSITIF_MEDIAN_05
Run Code Online (Sandbox Code Playgroud)

我不明白为什么我有这个问题.

ass*_*ias 10

我会想象

e2.getValue() - e1.getValue();
Run Code Online (Sandbox Code Playgroud)

为集合中的所有项目返回0,然后将其视为相等.尝试打印tag.getValue()标签以检查是否属于这种情况.

TreeSetjavadoc中提取(强调我的):

请注意,如果要正确实现Set接口,则由set维护的排序(无论是否提供显式比较器)必须与equals一致.(参见可比或比较用于一致的精确定义与equals).这是因为Set接口是按照equals操作定义的,但一个TreeSet实例使用其的compareTo执行所有元件的比较(或比较)方法,所以2从集合的角度来看,通过这种方法被认为相等的元素是相等的.集合的行为即使其排序与equals不一致也是明确定义的; 它只是不遵守Set接口的一般合同.