2016-12-16 63 views
0

我有以下业务需求 我有一个对象的value1和value2对,我需要根据值2在一个排序的数据结构中保存value1和value2什么是排序索引和项目数值的最佳方法

我所做的是制作hashmaps数组,以便数组中的每个元素包含两个元素的hasmap;值1和值2。但我被困在该分类机构,我需要对数组进行排序,根据第二个值(值2)

HashMap[] array = new HashMap[100](); 

for(int i = 0; i < array.length; i++){ 
    array [i].put("value1", value1); 
    array [i].put("value2", value2); 
} 

我不知道这是否是存储该让我的最佳方式想要最好的数据结构,使用和排序据此,但我需要排序时根据值2

回答

2

我需要跟踪值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以不同的方式:如果您排序以不同的方式列表,这非常有用。

+0

谢谢。你是对的我可能需要把两件东西放到地图中,并且value2的内容相同 – user3631926

+0

我已经在封装对象中的值(value1实际上是一个类中的私有属性)。如何在不使用ValueWrapper类的情况下使用上面的代码? – user3631926

+0

然后,您将具有value1属性的类放入集合中,并让您的类实现“Comparable”或为您的类编写一个“Comparator”。看到我上面的示例代码@ user3631926。 – Gray

1

跟踪值1,使其与VALUE2坚持的主要事情听起来像是你想有一个SortedMap实现,而不是,可能是TreeMap

SortedMap<String, String> values = new TreeMap<String, String>(); 
values.put(value2, value1); // value2 is the "key", value1 is the "value" 
+0

感谢。那么排序呢? – user3631926

+0

“SortedMap”按键自动排序。这就是使用它的关键。 – Thomas

+0

非常感谢...为什么我在这个问题上得到-1?你有好主意吗? – user3631926

0

根据Java文档“它不保证该顺序将随着时间保持不变”所以,如果排序此HashMap可能更改顺序,我建议使用类将数据存储在里面,

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; 
    } 
}); 
0

排序算法让我们实现一个辅助类implementsComparator

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()); 
相关问题