我想要使用属性“sort_1”排序的对象列表。但是当我想删除时,我希望它使用属性“id”。下面的代码代表了这个问题。
package javaapplication1;
import java.util.TreeSet;
public class MyObj implements Comparable<MyObj> {
public long sort_1;
public long id;
public MyObj(long sort, long id) {
this.sort_1=sort;
this.id=id;
}
@Override
public int compareTo(MyObj other) {
int ret = Long.compare(sort_1, other.sort_1);
return ret;
}
public String toString() {
return id+":"+sort_1;
}
public static void main(String[] args) {
TreeSet<MyObj> lst=new TreeSet<MyObj>();
MyObj o1 = new MyObj(99,1);
MyObj o2 = new MyObj(11,9);
lst.add(o1);
lst.add(o2);
System.out.println(lst);
MyObj o3 = new MyObj(1234, 1);
//remove myObje with id 1
boolean remove=lst.remove(o3);
System.out.println(lst);
}
}
该代码的输出是:
[9:11, 1:99]
[9:11, 1:99]
我需要对列表进行排序,因为我对列表做了很多添加。我不想明确使用任何“排序”方法。我有什么选择?
EDIT:
我的要求是:具有唯一的“id”的对象,但可以存在具有重复“sort”值的对象。
昨天偶然我也发现了这一点。这似乎是实施的一个工件TreeMap https://docs.oracle.com/javase/8/docs/api/java/util/TreeMap.html(这是 TreeSet 用于存储其条目的)。
TreeMap 使用二叉搜索树来存储键/值对,但它只使用给定的 Comparator(或者如果键类实现 Comparable 则使用比较函数)来检查相等性,正如您在这段代码摘录中看到的那样:
final Entry<K,V> getEntry(Object key) {
// Offload comparator-based version for sake of performance
if (comparator != null)
return getEntryUsingComparator(key);
if (key == null)
throw new NullPointerException();
@SuppressWarnings("unchecked")
Comparable<? super K> k = (Comparable<? super K>) key;
Entry<K,V> p = root;
while (p != null) {
int cmp = k.compareTo(p.key);
if (cmp < 0)
p = p.left;
else if (cmp > 0)
p = p.right;
else
return p;
}
return null;
}
我几乎称这是一个(无法真正修复的)错误,因为Comparable 接口的 JavaDoc https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html#compareTo-T-明确指出使用compareTo函数返回0并不一定意味着“相等”:
强烈建议但不严格要求 (x.compareTo(y)==0) == (x.equals(y))。
您将无法按照您想要的方式在 TreeSet 中存储内容。我建议使用普通的HashMap https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html or a 链接哈希映射 https://docs.oracle.com/javase/8/docs/api/java/util/LinkedHashMap.html然后在需要对输出进行排序时对输出进行排序集合.sort https://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#sort-java.util.List-.
除此之外,我总是觉得实现 Comparable 接口很奇怪。大多数事物并没有真正具有立即显而易见的“自然”顺序。有时这可能会导致奇怪的错误(就像这个!),所以我通常总是仅在需要时使用自定义比较器进行排序。 Java 8 也让编写这些代码变得非常简单!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)