基于ArrayList5 Size对ArrayList的HashMap进行排序

Ada*_*m_G 3 java hashmap

我意识到有类似的问题,但他们没有回答我的问题.

我需要根据相应值的ArrayList的大小返回我的HashMap的键.例如,如果我有:

HashMap<String,ArrayList<Integer>> unsortedMap = new HashMap<String,ArrayList<Integer>>();
unsortedMap.put("A",new ArrayList<Integer>(Arrays.asList(1,2,3)));
unsortedMap.put("B",new ArrayList<Integer>(Arrays.asList(4)));
unsortedMap.put("C",new ArrayList<Integer>(Arrays.asList(2,3,1,4)));
Run Code Online (Sandbox Code Playgroud)

我想要它返回"C""A""B"

Jon*_*eet 7

对于Java 7,您可以调用entrySet()get Set<Map.Entry<String,ArrayList<Integer>>>- 然后可以使用它来填充类似于ArrayList<Map.Entry<String,ArrayList<Integer>>>您可以使用自定义比较器排序的内容.

import java.util.*;

public class Test {
  public static void main(String[] args) {
    Map<String, ArrayList<Integer>> unsortedMap = new HashMap<>();
    unsortedMap.put("A", new ArrayList<Integer>(Arrays.asList(1, 2, 3)));
    unsortedMap.put("B", new ArrayList<Integer>(Arrays.asList(4)));
    unsortedMap.put("C", new ArrayList<Integer>(Arrays.asList(2, 3, 1, 4)));

    List<Map.Entry<String, ArrayList<Integer>>> list = 
        new ArrayList<>(unsortedMap.entrySet());
    Collections.sort(list, new EntryComparator());

    for (Map.Entry<String, ArrayList<Integer>> entry : list) {
      System.out.println(entry.getKey());
    }
  }

  private static class EntryComparator
      implements Comparator<Map.Entry<String, ArrayList<Integer>>>
  {
    public int compare(Map.Entry<String, ArrayList<Integer>> left,
        Map.Entry<String, ArrayList<Integer>> right) {     
      // Right then left to get a descending order
      return Integer.compare(right.getValue().size(), left.getValue().size());
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

在Java 8中,您可以使用流API使其更加流畅 - 同时采取基本相同的步骤.

import java.util.*;
import java.util.stream.*;

public class Test {
  public static void main(String[] args) {
    Map<String, ArrayList<Integer>> unsortedMap = new HashMap<>();
    unsortedMap.put("A", new ArrayList<Integer>(Arrays.asList(1, 2, 3)));
    unsortedMap.put("B", new ArrayList<Integer>(Arrays.asList(4)));
    unsortedMap.put("C", new ArrayList<Integer>(Arrays.asList(2, 3, 1, 4)));

    List<String> keys = unsortedMap
          .entrySet()
          .stream()
          .sorted((left, right) ->
              Integer.compare(right.getValue().size(), left.getValue().size()))
          .map(entry -> entry.getKey())
          .collect(Collectors.toList());

    for (String key : keys) {
      System.out.println(key);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)