2016-11-13 56 views
0

我有一個HashMap,我已經對類別進行了排序,並將它放在一個列表中,即最初的類別是: - A,B,C,D,排序後是D, C,B,A和我已將它添加到列表中。Java:在hashmap中顯示基於排序鍵的值

我想基於排序的類別順序顯示問題,例如 顯示包含類別的所有問題: - 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?

乙:另一個問題3? 另一個問題4?

+0

它看起來像你需要一個'LinkedHashMap的<類別,列出>',而不是'的HashMap <列表,列表>'。這是因爲與'LinkedHashMap'不同,'HashMap'沒有排序,您還需要使用單個類別作爲關鍵字,而不是整個類別列表作爲單個關鍵點,但是如果您想按特定順序訪問問題,我不確定「Map」是建模數據的好方法。 – Titus

+0

我不明白你選擇的地圖類型。爲什麼選擇一個類別列表而不僅僅是一個類別作爲你的關鍵? –

+0

您發佈的代碼與您描述的目標沒有任何關係。確實,你應該用代碼發佈你的問題,但它應該是*嘗試解決你的問題*。發佈的代碼執行以下操作:•將預定義的'Category'常量列表創建爲'list',*將'questionList'的副本創建爲'list1',*將list排序到它現有的順序, •創建一個奇怪類型的Map,•比較'list1'和它自己,*如果'true == true',打印'list1.get(0).getQuestion()'。所以整個代碼可以縮短爲'out.println(questionList.get(0).getQuestion());'... – Holger

回答

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

你有沒有得到?如果沒有,請讓我知道我會根據您的要求更新我的答案。 –

+0

o1.getQuestion()。substring(0,1)給出問題的第一個字母。我認爲你的情況是A,B,C,D。 –

1

我想根據即類別 顯示的排序順序與類別中的所有問題,以顯示問題: - d則顯示所有問題 與類別: - C等。

要執行您的需求,問題必須與類別相關。

你必須做的兩種方法:使用比較(如@Surace完成),以在最終列表中的所有問題進行排序

  • 創建地圖

比較更加簡潔,這是相當不錯的主意,但在你的情況下,它有一個缺點,它不會保留類別(問題作爲價值和類別爲重點名單)

d:你叫什麼名字 - :

我希望我的輸出是這樣的:當你想在你的渲染與每一個問題嗎?你好嗎?

C:另一個問題1?另一個問題2?

乙:另一個問題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; 
    } 
} 
+0

只是一個提示:'Category'顯然是'enum',所以你根本不需要實現'Comparator'。你可以使用'new TreeMap <>();',但是使用'EnumMap'而不是'TreeMap'會使它更加高效。 – Holger

+0

@Holger在EnumMap中,用戶等待以Enum順序的相反順序顯示類別,條目按照Enum序列的順序進行維護。 – davidxxx

+1

哦。 OP希望以相反的順序排列*。這真的很好隱藏......如果你想按相反的順序排序,只需使用['reverseOrder()'](https://docs.oracle.com/javase/8/docs/api/java/util/Collections。 html#reverseOrder--)而不是實現你自己的比較器。然後,每個讀者都會立即認識到這個意圖。 – Holger