如何在android中按字符串对HashMap <String,String []>进行排序

Ovi*_*rgu 2 sorting string android arraylist hashmap

我有这个代码:

    HashMap<String, String[]> unsorted = new HashMap<String, String[]>();
    String[] values = new String[3];
    String key;

    //add data to hashmap
    key = "abc";
    values[0] = "a"; values[1]="b"; values[2]="c";
    unsorted.put(key, values);

    key = "abc";
    values[0] = "aa"; values[1]="bb"; values[2]="cb";
    unsorted.put(key, values);

    key = "def";
    values[0] = "d"; values[1]="e"; values[2]="f";
    unsorted.put(key, values);

    //sort hashmap
    /***********/

    //output should be:
    { abc-[a,b,c], abc-[aa,bb,cc], def-[d,e,f] }

    //or

    { abc-[aa,bb,cc], abc-[a,b,c], def-[d,e,f] }
Run Code Online (Sandbox Code Playgroud)

我怎么能那样排序呢?注意:我尝试使用TreeMap和其他示例,但它们消除了相等的元素.

编辑:我解决了我的问题:)感谢Guillaume.这是我用过的:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

public class test {

public static void main(String[] args) {

    ArrayList<CustomObject> objs = new ArrayList<CustomObject>();

    objs.add(new CustomObject("abc", new String[] {"a", "b", "c"}));
    objs.add(new CustomObject("def", new String[] {"d", "e", "f"}));
    objs.add(new CustomObject("abc", new String[] {"aa", "bb", "cc"}));


    System.out.println(objs.isEmpty());

    Collections.sort(objs, new Comparator<CustomObject>() {
        @Override
        public int compare(CustomObject o1, CustomObject o2) {
            int i = o1.getKey().compareTo(o2.getKey());
            if(i == 0)
                return -1;
            return i;
        }
    });

    for(int i=0; i<objs.size(); i++)
        System.out.println("key/value pair:" + objs.get(i).getKey() + " - " + objs.get(i).getValues()[0]);
    }
}
Run Code Online (Sandbox Code Playgroud)

和CustomObject:

public class CustomObject {

private String key;
private String[] values;

public CustomObject(String key, String[] values) {
    this.key = key;
    this.values = values;
}

public String getKey() {
    return key;
}

public String[] getValues() {
    return values;
}
}
Run Code Online (Sandbox Code Playgroud)

Gui*_*ume 5

如果你需要特殊的排序,并且能够拥有一个具有相同"关键字"的多个对象,那就是List使用自定义的尖叫Comparator.

1-定义要存储在列表中的一类元素.在您的情况下,它是一个具有2个字段的对象:"键"和String数组.我们打电话给你CustomObject(你可以随意打电话)

2-将所有对象粘贴在列表中

像那样:

list.add(new CustomObject("abc", new String[] {"a", "b", "c"});
list.add(new CustomObject("abc", new String[] {"aa", "bb", "cc"});
list.add(new CustomObject("def", new String[] {"d", "e", "f"});
Run Code Online (Sandbox Code Playgroud)

3-使用自定义比较器订购列表.

要订购清单吗

Collections.sort(list, new Comparator<CustomObject>() {
        @Override
        public int compare(CustomObject o1, CustomObject o2) {
            return o1.getArray().compare(o2.getArray());
        }
    });
Run Code Online (Sandbox Code Playgroud)

(你的比较器需要更复杂,才能正确地比较数组,但你看到了我的观点).


另一种方法是为你的CustomObject(工具Comparable)添加一个自然的顺序,并将它们粘贴到一个TreeSet.

  • 谢谢,我会尝试第一种方法,但是我必须为项目列表定义每个功能吗?(public void add(int index,CustomObject element),public CustomObject get(int index)等) (2认同)