我正在尝试根据动态变化的键对对象的ArrayList进行排序。
public class My Objects {
public String name;
public int id;
}
String[] nameKeys = {"key1", "key2", "key3"};
ArrayList<MyObjects> ObjectArray = new ArrayList<MyObjetcs>();
现在我想使用“keys”变量中的任何键来对ObjectArray进行排序。 用户将确定将使用哪个密钥。
我被困在这几个小时,所以我很感激我能得到任何帮助。 感谢
编辑:
ObjectArray.add( new MyObjects("key1", 1);
ObjectArray.add( new MyObjects("randomname", 2);
ObjectArray.add( new MyObjects("anothername", 3);
ObjectArray.add( new MyObjects("key1", 4);
sort("randomname", ObjectArray); //What I'd like to be able to do
for( MyObjects ob : ObjectArray)
area.append(ob.name+"->"+ob.id+"\n");
Result:
randoname->2
key1->1
key1->4
anothername->3
第二次编辑: 从一开始我就是这个问题。感谢大家的帮助。
答案 0 :(得分:0)
我认为您可以使用Comparator
。
让我们假设用户选择了keys[0]
,因为密钥排序需要基于。
首先,将Comparator
创建为单独的类或匿名。它应该有compare()
方法(对于我去的方式,我需要一个单独的方法):
public class KeyBasedComparator implements Comparator<MyObjects> {
public final String key;
public KeyBasedComparator(String key) {
this.key = key;
}
public int compare(MyObjects object1, MyObjects object2) {
if ("key1".equals(this.key)) {
return new Integer(object1.id).compareTo(object2.id);
} else if ("key2".equals(this.key)) {
return object1.name.compareTo(object2.name);
}
//some other key-based logic possibly here
}
}
好的,现在我们有了这个比较器。我们将这样排序:
Collections.sort(ObjectArray, new KeyBasedComparator(keys[0]));
答案 1 :(得分:0)
你可以通过几种不同的方式做到这一点。
第一个是编写一个myObjectSort
函数,它接受您要排序的键,并使用它通过将相应的Comparable
对象传递给排序来执行排序。
第二种方法是在一个对象中捕获它,该对象在构造时(可能通过一个setter)获取键,并通过相同的Comparable
对象执行排序。
如果您提供有关密钥实际执行情况以及您打算如何对其进行排序的更多信息,我可以提供代码。
答案 2 :(得分:0)
您可以创建不同的Comparator实现,如果您使用的是Java 8,则可以使用Stream API并行或顺序运行它。
示例代码为:
Stream<String> names2 = Stream.of("aBc", "d", "ef", "123456");
List<String> reverseSorted = names2.sorted(Comparator.reverseOrder()).collect(Collectors.toList());
System.out.println(reverseSorted); // [ef, d, aBc, 123456]
请注意Comparator.reverseOrder()
是java提供的比较器之一。