2016-11-13 11 views
0

私はHashMapを持っています。カテゴリをソートしてリストに入れました。つまり、最初はA、B、C、D、 C、B、Aと私はリストに追加しました。Java:ハッシュマップのソートされたキーに基づいて値を表示

カテゴリの並べ替え順に基づいて質問を表示したいとします。 カテゴリのすべての質問を表示します。 - D カテゴリにすべての質問を表示します。ここ

は、私が試したものです: -

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?

+0

あなたの代わりに 'のHashMap <リスト、一覧>'の ''のLinkedHashMap <カテゴリー、リスト>を必要とするように見えます。これは、 '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()。部分文字列(0,1)は質問の最初の文字を返す。あなたのケースではA、B、C、Dだと思います。 –

1

: - :ようにCや - Dその後、カテゴリを持つすべての質問に 表示します。

質問を実行するには、カテゴリに関連する質問が必要です。最終的なリストのすべての質問をソートする(@Suraceが行われたように)、コンパレータを使用して

  • は、次の2つの行う方法があります。

  • コンパレータは、より簡潔であり、それはかなり良いアイデアですが、あなたの場合には、それは欠点があり

(キーとして値やカテゴリなどの質問のリストを)マップを作成することは、それはカテゴリを保持しません。

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

ヒント: 'Category'は明らかに' enum'ですので、 'Comparator'を実装する必要は全くありません。あなたは単に 'new TreeMap <>();'を使うことができますが、 'TreeMap'の代わりに' EnumMap'を使うとさらに効率的になります。 – Holger

+0

@HolgerユーザはEnum ordinalsの逆の順序でCategoryを表示するのを待ちますが、EnumMapではEnum ordinalの順にエントリが維持されます。 – davidxxx

+1

ああOPはカテゴリ*を逆順にしたいと考えています*。それは本当にきれいに隠されています...逆順でソートする場合は、['reverseOrder()'](https://docs.oracle.com/javase/8/docs/api/java/util/Collections)を使用してください。 html#reverseOrder--)を使用してください。それから、すべての読者が意図をすぐに認識します。 – Holger

関連する問題