繁体   English   中英

如何基于整数数组排序对象集

[英]how to order set of objects based on array of integers

我有一堂课叫做Variable

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

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

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

 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}如何根据整数数组对降序的对象列表进行排序?

如果您希望保持Class Variable不变,则以下代码将给定的vars排序在外面:

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

如果可以更改Class Variable ,则让它实现Comparable接口:

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

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

然后您可以按以下方式对vars进行排序:

Collections.sort(vars);

使用排序后的集合,例如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
    }
});

现在您有了一个Variable Set的排序Set 这保证总是被排序。

您的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
}

根据代码,只要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); , 而已。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM