我有一个名为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}
如何根据整数数组对降序对象列表进行排序?
答案 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);
,就是这样。