簡體   English   中英

Java:根據哈希圖中的排序鍵顯示值

[英]Java: display values based on sorted keys in hashmap

我有一個HashMap,我對類別進行了排序,並將其放在列表中,即最初的類別為:-A,B,C,D,排序后為D,C,B,A,我將其添加到了清單。

我想根據類別的排序順序顯示問題,即顯示類別為-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?

我想根據類別的排序順序顯示問題,即顯示類別為-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;
  }
}

我認為這會給您預期的輸出。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM