将TreeSet元素的顺序更改为自定义输出

时间:2012-05-09 11:31:31

标签: java sorting treeset

我知道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 个答案:

答案 0 :(得分:6)

使用LinkedHashSet

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,则意味着以相反的顺序存储元素。