根据给定的顺序对矢量进行排序

时间:2011-02-28 20:22:05

标签: java sorting vector

对于这样的给定矢量,

Vector<Temp> s = new Vector<Temp>();
s.add(new Temp("a",1));
s.add(new Temp("b",2));
s.add(new Temp("c",3));
s.add(new Temp("b",4));
s.add(new Temp("b",6));
s.add(new Temp("c",5));

期望的测序(b,a,c)

排序后,它应该像

b,2  
b,4  
b,6  
a,1  
c,3  
c,5 

我知道如何使用比较器根据一个字段对对象进行排序,但这里的问题不同,所需的序列也各不相同,我每次都必须根据该序列进行排序。

有什么想法吗?

4 个答案:

答案 0 :(得分:6)

您应该编写一个自定义比较器,将序列作为参数,并相应地比较元素。

以下是一个示例实现:

public class Test {
    public static void main(String[] args) {
        Vector<Temp> s = new Vector<Temp>();
        s.add(new Temp("a",1));
        s.add(new Temp("b",2));
        s.add(new Temp("c",3));
        s.add(new Temp("b",4));
        s.add(new Temp("b",6));
        s.add(new Temp("c",5));

        String[] seq = { "b", "a", "c" };

        Collections.sort(s, new CustomComparator(seq));

        for (Temp tmp : s)
            System.out.println(tmp);
    }

    static class CustomComparator implements Comparator<Temp> {
        List<String> sequence;

        CustomComparator(String[] seq) {
            sequence = Arrays.asList(seq);
        }

        public int compare(Temp t1, Temp t2) {
            if (t1.s.equals(t2.s))
                return ((Integer) t1.i).compareTo(t2.i);
            return sequence.indexOf(t1.s) - sequence.indexOf(t2.s);
        }
    }
}

输出: (ideone.com demo)

(b, 2)
(b, 4)
(b, 6)
(a, 1)
(c, 3)
(c, 5)

答案 1 :(得分:2)

只是一个简单的想法:您可以构建一个代表您的序列的地图{b-> 0,a-> 1,c-> 2},然后在比较器中使用映射值而不是实际字段。

答案 2 :(得分:0)

您仍然可以使用比较器。首先比较String字段,如果相等而不是返回0,则比较int字段。如果两个字段相同,则比较器只返回零。

答案 3 :(得分:0)

此处仍然适用比较器。在类中实现类似的接口,并使用序列和值作为compareTo()逻辑的一部分。