2014-01-28 36 views
0

我有存储的订单号作为键和一个字符串值作为值LinkedHashMap中:在Android中,如何订购LinkedHashMap?

{12,"apple"} 
{1,"grape"} 
{23,"pineapple"} 
{2,"pear"} 
{16,"cherry"} 

我需要重点之前,我做什么都与他们对它们进行排序。我正在研究编写一个比较器,但在如何做到这一点上我试图完成一些工作。

+0

'LinkedHashMap'保留迭代顺序。这意味着它是根据这个标准进行订购的:插入顺序;它不可能提供你的定制标准。 –

回答

1

而是使用TreeMap进行研究,它将自动按照Integer键的升序对添加的元素进行排序。

TreeMap<Integer, String> treeMap = new TreeMap<Integer, String>(); 

treeMap.add(1, "foo"); 
treeMap.add(3, "baz"); 
treeMap.add(2, "bar"); 

按照升序整数键的顺序遍历此TreeMap将打印“foo bar baz”。

+0

看看现在的 – dcp3450

+1

你也可以使用NavigableMap,其中你可以有降序键或弹出keys.as等.... 新的TreeMap ()。降序地图() – markg

+0

TreeMap没有给出我想要的精确排序。我使用了TreeMap。它工作到了。 treeMap.add(1,“foo”); treeMap.add(3,“baz”); treeMap.add(2,“bar”); 但它不能与 treeMap.add(6,“foo”); treeMap.add(7,“baz”); treeMap.add(8,“bar”); treeMap.add(9,“bar”); treeMap.add(10,“bar”); treeMap.add(11,“bar”); treeMap.add(12,“bar”); 它采取了像下面的命令 treeMap.add(10,“bar”); treeMap.add(11,“bar”); treeMap.add(12,“bar”); treeMap.add(6,“foo”); treeMap.add(7,“baz”); treeMap.add(8,“bar”); treeMap.add(9,“bar”); –

2

通常情况下,其类型中名称为Hash的任何东西都不适用于订购,至少不是大多数人订购的方式。散列结构的效率非常高,因为它们拥有基于散列的自己的访问/检索函数,这些散列函数使得项目分配的方式与我们所知的“有序”方式不同,因此它们对访问和写入非常有效,但它们不会允许那种排序。

0

就像NKN之前所说的,HashMap的意思并不是要命令。 LinkedHashMap的好处在于它保留了插入错误,但它不提供排序机制。

为了实现这个目标,你想创建一个POJO类来保存你的数据

public class fruit { 
int count; 
String name; 

// getters and setter 
} 

不是让该对象实现Comparable接口,并覆盖compareTo()方法。一旦做到这一点,你可以拨打

Collections.sort(LinkedHashMap的)

0

通过自然地图是“无序/未分类”集合,如果你需要的东西一样,还有其他方法可以使用,如SparseArray(这是更适合INT /值元素),你可以创建你的INT键列表,排序,然后通过他们迭代获取值如下:

//This would be your SparseArray 
{12,"apple"} 
{1,"grape"} 
{23,"pineapple"} 
{2,"pear"} 
{16,"cherry"} 

int[] sortedInt = {1,2, 12, 16, 23};//Previously sorted values using any Java sorting functionality 
for(int i = 0 ; i < sortedInt.length; i++){ 
    String value = yourSparseArrat.get(sortedInt[i]); 
} 

而且你去那里,由排序您的密钥,然后获取值按照这个顺序你可以得到你需要的东西。

问候!

0

如果您需要以某种顺序存储Map,则必须使用TreeMap而不是LinkedHashMapLinkedHashMap只是存储元素以添加元素。 使用TreeMap这样


TreeMap<Integer, String> map = new TreeMap<Integer, String>(
      new Comparator<Integer>() { 
       @Override 
       public int compare(Integer o1, Integer o2) { 
        if (o1 > o2) return 1; 
        if (o1 < o2) return -1; 
        else return 0; 
       } 
      } 
    );