排序索引和项目数值的最佳方法是什么

时间:2016-12-16 13:58:25

标签: java arrays sorting hashmap

我有以下业务要求 我有一个对象的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

4 个答案:

答案 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());