我有一个HashMap
,其中key是一个字符,value是一些用户定义的对象。我在TreeSet
中添加了相同的对象。 HashMap
和TreeSet
中的条目数相等。
稍后我想使用用户提供的字符输入从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()
完美无缺。但不适用于用户定义的对象。
答案 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);
}