0

我知道 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

4

4 回答 4

6

LinkedHashSet它,

TreeSet对元素进行排序,对于字符串,它根据自然顺序进行排序(这是其比较器的实现方式),如果要管理插入顺序,则需要用户LinkedHashSet

如果您不需要唯一性(集合的功能),那么就去List

于 2012-05-09T11:32:21.760 回答
3

既然你提到必须使用 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);
 }  

所以基本上你正在实现你自己的比较器,它只不过是为插入的字符串分配某些整数值(我假设你已经知道了)。

注意:如果您没有在 returnCode() 方法中捕获该选项,此解决方案将不起作用。我假设您已经知道输入到 TreeSet 的数据。

于 2012-05-09T15:59:07.917 回答
1

这要容易得多:

TreeSet treeSetObj = new TreeSet(Collections.reverseOrder());
于 2015-01-22T18:07:59.280 回答
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 这意味着以相反的顺序存储元素。

于 2018-06-30T17:04:44.957 回答