Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 根据给定序列对向量进行排序_Java_Sorting_Vector - Fatal编程技术网

Java 根据给定序列对向量进行排序

Java 根据给定序列对向量进行排序,java,sorting,vector,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)); 我知道如何使用comparator根据一个字段对对象进行排序,但这里的问题不同,所需的

对于这样一个给定的向量

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));

我知道如何使用comparator根据一个字段对对象进行排序,但这里的问题不同,所需的顺序不同,我每次都必须根据该顺序进行排序


有什么想法吗?

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

下面是一个示例实现:

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);
        }
    }
}

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

下面是一个示例实现:

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);
        }
    }
}

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

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

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

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

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

比较器在这里仍然适用。在类中实现comparable接口,并将序列和值用作compareTo()逻辑的一部分

那太好了。感谢您的快速回复。:)我并没有考虑创建比较器的构造函数来提供序列。好主意。再次感谢,太好了。感谢您的快速回复。:)我并没有考虑创建比较器的构造函数来提供序列。好主意。再次感谢。
(b, 2)
(b, 4)
(b, 6)
(a, 1)
(c, 3)
(c, 5)