我知道TreeSet以排序的方式存储对象。但有没有办法可以自定义订单?
例如,如果我有一个treeSet:
TreeSet t1 = new TreeSet();
t1.add("c");
t1.add("d");
t1.add("a");
现在,如果我重复它>
Iterator it1 =t1.iterator();
while(it1.hasNext()){
Object o1 = it1.next();
System.out.println(o1);
}
我总是得到订单:a>c>d
,但是我希望它返回与我添加元素相同的顺序,即c>d>a
?
答案 0 :(得分:6)
TreeSet
对元素进行排序,对于字符串,它根据自然顺序排序(这是其比较器的实现方式),如果要管理插入顺序,则需要用户LinkedHashSet
< / p>
如果您不需要uniquness(set的功能),那么请转到List
答案 1 :(得分:2)
既然你提到了绑定使用TreeSet的问题,我想到了这样的事情:
Set<String> result = new TreeSet<String>(new Comparator<String>(){
@Override
public int compare(String arg0, String arg1) {
return returnCode(arg0).compareTo(returnCode(arg1));
}
});
其中:
private Integer returnCode(String p){
int code = 0;
String id = p.toLowerCase();
if ("a".equalsIgnoreCase(id)) code = 3;
else if ("b".equalsIgnoreCase(id)) code = 2;
else if ("c".equalsIgnoreCase(id)) code = 1;
//etc
return new Integer(code);
}
所以基本上你实现自己的比较器,除了为插入的String赋予某些整数值(我假设你已经知道)。
注意:此解决方案不起作用,因为您没有在returnCode()方法中捕获该选项。我假设您已经知道正在提供给TreeSet的数据。
答案 2 :(得分:1)
这更容易:
TreeSet treeSetObj = new TreeSet(Collections.reverseOrder());
答案 3 :(得分:0)
我有一个很好的答案。这是我的第一个。
import java.util.*;
class M
{
public static void main(String args[])
{
TreeSet<String> t=new TreeSet<>(new MyComparator());
t.add("c");
t.add("d");
t.add("a");
System.out.println(t);//[c,d,a] not [a,c,d] ....your answer
}
}
class MyComparator implements Comparator
{
public int compare(Object o1,Object o2)
{
String i1=(String)o1;
String i2=(String)o2;
return +1; //Store elements as they come
}
}
基本上+1确实按照元素出现的顺序存储元素。
永远记住 如果我写return +1,则意味着按照元素出现的顺序存储它们。 如果我写return -1,则意味着以相反的顺序存储元素。