我有以下业务要求 我有一个对象的value1和value2对,我需要根据值2在排序的数据结构中保存value1和value2。
我所做的是制作一个哈希映射数组,以便数组中的每个元素都包含两个元素的hasmap; value1和value2。但我被困在排序机制中,我需要根据第二个值(value2)对数组进行排序
实施例
HashMap[] array = new HashMap[100]();
for(int i = 0; i < array.length; i++){
array [i].put("value1", value1);
array [i].put("value2", value2);
}
我不确定这是否是存储它的最佳方式,因此我希望使用最佳数据结构并进行相应排序,但我需要跟踪value1以便在按照排序时坚持使用value2值2
答案 0 :(得分:2)
我需要跟踪value1,以便在根据value2
排序时坚持使用value2
@Thomas可能是正确的,你需要的是一个有序的地图。限制是SortedMap
仅按地图的键排序,这些键必须是唯一的。您不能将两件事物放入具有相同value2
内容的地图中。
另一种方法是创建一个对象来封装你的两个值。这就是我们经常用面向对象语言做事的方式。
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
。
答案 1 :(得分:1)
听起来你想要一个SortedMap
实现,可能是TreeMap
:
SortedMap<String, String> values = new TreeMap<String, String>();
values.put(value2, value1); // value2 is the "key", value1 is the "value"
答案 2 :(得分:0)
根据java doc&#34;它不保证订单会随着时间的推移而保持不变。所以如果排序这个HashMap可能会改变它的顺序,我建议用class来存储数据,
public class test {
public type1 a;
public type2 b;
}
所以你可以像这样使用默认的java排序算法
Arrays.sort(array, new Comparator<test>() {
@Override
public int compare(test o1, test o2) {
if(o1.a>o2.a)return 1;
else if(o1.a==o2.a)return 0;
return -1;
}
});
答案 3 :(得分:0)
让我们实现一个implements
Comparator
:
public class MyComparator implements Comparator {
public int compare(HashMap[] a, HashMap b) {
String aVal = a.get("value2");
String bVal = b.get("value2");
if ((aVal == null) || (bVal == null)) {
return 0;
}
return aVal.compareTo(bVal);
}
}
并像这样使用它:
Arrays.sort(array, new MyComparator());