Java:基于hashmap中的排序键显示值

时间:2016-11-13 16:08:05

标签: java sorting arraylist collections hashmap

我有一个HashMap,我已经对类别进行了排序并将其放入列表中,即最初的类别是: - A,B,C,D,排序后是D,C,B,A和i'我已将其添加到列表中。

我想根据类别的排序顺序显示问题,即 显示所有类别的问题: - D. 然后用类别显示所有问题: - C等。

这是我尝试过的: -

   List<Category> list = Arrays.asList(Category.values());
     List<Question> list1 = new ArrayList<>();
     list1.addAll(questionList);


    Collections.sort(list, new Comparator<Category>() {
        @Override
        public int compare(Category o1, Category o2) {
            return o2.ordinal() - o1.ordinal();

        }
    });
    System.out.println("Categories" +list);
    Map< List<Category>,List<Question>> map = new HashMap<>();

     map.put(list, list1);}}

   boolean ty = list1.containsAll(list1);
    if(ty==true){
  out.println(list1.get(0).getQuestion())  ;}

我希望我的输出如下: -

D:你叫什么名字?    你好吗?

C:另一个问题1?    另一个问题2?

B:另一个问题3?    另一个问题4?

2 个答案:

答案 0 :(得分:1)

  

我想根据类别的排序顺序显示问题,即   显示所有类别的问题: - D然后显示所有问题   与类别: - C等。

为了满足您的需求,问题必须与某个类别相关。

您有两种方法:

  • 使用比较器(如@Surace完成)对最终列表中的所有问题进行排序。
  • 创建地图(问题列表作为值和类别作为键)

比较者更简洁,这是一个好主意,但在你的情况下,它有一个缺点,它不会在你的渲染中保留与每个问题相关的类别:

  

我希望我的输出是这样的: -

     D:你叫什么名字?你好吗?

     C:另一个问题1?另一个问题2?

     

B:另一个问题3?另一个问题4?

您可以使用存储在问题中的类别信息检索信息,但它会强制您在迭代期间执行相当笨拙的处理,因为该类别不是外部信息,而是您必须在另一个对象中搜索的计算信息。

通过创建按类别关联问题的地图,您只需要迭代以呈现信息,并且以更一般的方式,您可以对每个类别的迭代执行任何其他处理。

这里是代码:

public static void main(String[] args) {

  // create your questions
  List<Question> questionsInput = new ArrayList<>();
  questionsInput.add(new Question("question 1 For A?", Category.A));
  questionsInput.add(new Question("question 2 For A?", Category.A));

  questionsInput.add(new Question("question 1 For A?", Category.B));
  questionsInput.add(new Question("question 2 For A?", Category.B));

  Map<Category, List<Question>> map = associateQuestionByCat(questionsInput);

  // display info
  for (Entry<Category, List<Question>> entry : map.entrySet()) {
      System.out.print("cat " + entry.getKey() + ":");
      for (Question q : entry.getValue()) {
        System.out.print(q.getQuestion());
      }
      System.out.println("");
  }

}

public static Map<Category, List<Question>> associateQuestionByCat(List<Question> questions ) {

  Map<Category, List<Question>> questionsByCategory = new TreeMap<>(Collections.reverseOrder());

  for (Question q : questions) {
    final Category currentCat = q.getCat();
    List<Question> questionsForCurrentCat = questionsByCategory.get(currentCat);
    if (questionsForCurrentCat == null) {
        questionsForCurrentCat = new ArrayList<>();
        questionsByCategory.put(currentCat, questionsForCurrentCat);
    }
    questionsForCurrentCat.add(q);
  }

  return questionsByCategory;
  }
}

答案 1 :(得分:0)

我认为这会给你预期的输出。

Collections.sort(list, new Comparator<Category>() {

      @Override
      public int compare(Category o1, Category o2) {
//       o1.getCategoryName() is A or B or C or D
         return o1.getCategoryName().compareTo(o2.getCategoryName()); 
        }
});