如何根据整数数组排序对象集

时间:2013-02-23 11:20:20

标签: java sorting

我有一个名为Variable

的类
Class Variable{ private String name; private int[] domain; //...etc} 

表示特定结构中的变量(约束满足问题)。

我在ArrayList中实例化了一组变量<变量>并填充了一个整数数组。

 ArrayList<Variable> vars=new ArrayList<Variable>();
 Variable a=new Variable("A",new int[]{1,2});
 vars.add(a);
 // Define all variables;
 int[] cons=new int[vars.size()];
  for(int i=0;i<cons.length;i++)
    cons[i]=number_of_constraints(vars.get(i));
    // cons contains number of involved constraints for each variable

现在我需要根据约束的数量对它们进行降序排序。

换句话说:给定对象列表[(A,{1,2}) , (B,{3,4}) , (C,{5,6}) ]和整数数组cons={1,2,0}如何根据整数数组对降序对象列表进行排序?

4 个答案:

答案 0 :(得分:2)

如果您希望保持课程Variable不变,则以下代码会对给定的vars进行排序:

   Collections.sort(vars, new Comparator<Variable>() {
       public int compare(Variable var1, Variable var2) {
           return var2.number_of_constraints() - var1.number_of_constraints();
    }});

如果您可以更改班级Variable,请让它实施界面Comparable

class Variable implements Comparable<Variable> {
    //...

    public int compareTo(Variable other) {
        return this.number_of_constraints() -
               other.number_of_constraints();
    }
}

然后您可以按{<1}}排序:

vars

答案 1 :(得分:2)

使用排序的集合,如TreeSet

class Variable {

    private String name;
    private int[] domain;
};
final Set<Variable> variables = new TreeSet<Variable>( new Comparator<Variable>() {

    public int compare(Variable o1, Variable o2) {
        //Do comparison here
        //return -1 if o1 is less than o2
        //1 if o1 is greater than o2
        //0 if they are the same
    }
});

现在您的Set已排序Variable。保证始终对其进行排序。

答案 2 :(得分:1)

您的Variable类应该实现Comparable接口, 如果是这样,您应该实施compareTo方法。

之后,您可以通过调用Collection.sort方法对其进行排序。

如果你想通过排列进行排序,如果你的索引只是创建一个新的ArrayList并将每个索引映射到新索引(使用for循环)

这是一种(通用)方法

public static <T> ArrayList<T> permutate(ArrayList<T> origin,int[] permutation){
        ArrayList<T> result = new ArrayList<T>(permutation.length);
        for(int j=0;j<permutation.length;j++){
            result.add(null);
        }
        for(int i=0;i<permutation.length;i++){
            result.set(i, origin.get(permutation[i]));
        }
        return result;
    }

您可以执行myArrayList= permutate(myArrayList, new int{1,2,3});

以下是更基本的用例(整数)中的示例用法:

public static void main(String... args){
    ArrayList<Integer> origin = new ArrayList<>(4);
    origin.add(1);
    origin.add(2);
    origin.add(3);
    origin.add(4);

    int[] per = new int[]{2,1,3,0};
    origin = permutate(origin,per);
    System.out.println(Arrays.toString(origin.toArray())); //prints [3,2,4,1], your permutation
}

答案 3 :(得分:1)

至于Variable包含numOfConstraints,根据您的代码,您可以设置Variable类实现Comparable界面,例如

public class Variuable implements Comparable<Variable> {

    private int numOfConstraints;

    public int compareTo(Variable other){
        if(this == other) { return 0; }
        return (numOfConstraints == other.numOfConstraint) ? 0 : ((numOfConstraints > other.numOfConstraint) ? 1 : -1);
    }

}

然后使用效用方法java.util.Collections.sort(vars);,就是这样。