[英]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.