我需要跟踪值1,使其与值2时坚持排序根据值2
@Thomas可能是正确的,你需要的是一个有序映射。限制在于SortedMap
只能根据地图的键必须是唯一的。您不能将两件东西放入地图中,并且其内容相同。
另一种方法是创建一个对象来封装你的两个值。这就是我们经常用面向对象的语言来做事情的方式。
private static class ValueWrapper {
private final String value1;
private final String value2;
public ValueWrapper(String value1, String value2) {
this.value1 = value1;
this.value2 = value2;
}
}
然后,您可以创建这些集合:
List<ValueWrapper> wrappers = new ArrayList<>();
wrappers.add(new ValueWrapper("1", "a"));
wrappers.add(new ValueWrapper("2", "b"));
如果你想对它们进行排序,你可以使物体本身实现Comparable
或使用外部Comparator
排序。所以,你可以改变物体:
private static class ValueWrapper implements Comparable<ValueWrapper> {
private final String value1;
private final String value2;
public ValueWrapper(String value1, String value2) {
this.value1 = value1;
this.value2 = value2;
}
public int compareTo(ValueWrapper other) {
// we are comparing the value2 fields here
return this.value2.compareTo(other.value2);
}
}
然后,你可以这样做:
List<ValueWrapper> wrappers = new ArrayList<>();
wrappers.add(new ValueWrapper("1", "a"));
wrappers.add(new ValueWrapper("2", "b"));
// this sorts objects that implement Comparable
Collections.sort(wrappers);
作为替代方案,可以提供外部Comparator
类。
// this uses an anonymous Comparator class but you can define a class to do it
Collections.sort(wrappers, new Comparator<ValueWrapper>() {
public int compare(ValueWrapper o1, ValueWrapper o2) {
return o1.value2.compareTo(o2.value2);
}
});
然后,您可以定义几个不同的Comparator
类,每一类比较ValueWrapper
以不同的方式:如果您排序以不同的方式列表,这非常有用。
谢谢。你是对的我可能需要把两件东西放到地图中,并且value2的内容相同 – user3631926
我已经在封装对象中的值(value1实际上是一个类中的私有属性)。如何在不使用ValueWrapper类的情况下使用上面的代码? – user3631926
然后,您将具有value1属性的类放入集合中,并让您的类实现“Comparable”或为您的类编写一个“Comparator”。看到我上面的示例代码@ user3631926。 – Gray