使用HashMap Value从TreeSet中删除对象

时间:2014-12-12 06:16:58

标签: java hashmap treeset

我有一个HashMap,其中key是一个字符,value是一些用户定义的对象。我在TreeSet中添加了相同的对象。 HashMapTreeSet中的条目数相等。

稍后我想使用用户提供的字符输入从HashMap检索一个对象。 从HashMap检索对象后,我想从TreeSet中删除相同的对象。但是,TreeSet.remove()无法识别对象。

import java.util.TreeSet;
import java.util.HashMap;

public class Trial {

char c;
int count;  
HashMap<Character, Trial> map;
TreeSet <Trial> set;

public Trial(char c, int count)
{
    this.c = c;
    this.count = count;
    map = new HashMap<Character, Trial>();
    set = new TreeSet<Trial>(new New_Comparison());     
}

public static void main(String[] args) {
    // TODO Auto-generated method stub

    Trial root = new Trial('0', 0);
    int i;
    for(i = 0; i < 26; i++) //add all characters a-z with count 0-25 resp. in root
    {
        char ch = (char)('a' + i);
        Trial t = new Trial(ch, i);
        root.map.put(ch, t);
        root.set.add(t);            
    }

    System.out.println(root.set.size()); //size = 26
    Trial t = root.map.get('c');
    if(t == null)
        return;
    root.set.remove(t);     
    System.out.println(root.set.size());        //size remains the same, expecting 25

}

}

比较者类:

import java.util.Comparator;

public class New_Comparison implements Comparator <Trial>{

public int compare(Trial n1, Trial n2) {
    if(n1.c <= n2.c)
        return 1;
    return -1;
}


}

输出: 26 26

请帮忙。如果对象是String or Integer, TreeSet.remove()完美无缺。但不适用于用户定义的对象。

4 个答案:

答案 0 :(得分:9)

用于创建compare的{​​{1}}比较器的New_Comparison方法永远不会返回0,因此就TreeSet而言,这意味着两个TreeSet元素是相等的。

这就是Trial无法删除任何内容的原因。

将其更改为:

set.remove(t)

答案 1 :(得分:1)

实施比较方法,就好像两个值相等,比较方法将失败。

public int compare(Trial n1, Trial n2) {
   return  n1.c.compareTo(n2.c);
}

答案 2 :(得分:0)

比较者错了,试试这个

public int compare(Trial n1, Trial n2) {
    return n1.c - n2.c;
}

答案 3 :(得分:-1)

我将使用的一种方法是在没有实现比较器的情况下使用TreeSet的contains()方法。这是一种方式,但如何做逻辑是你的选择。

if(root.set.contains(t)){
    root.set.remove(t); 
}