2016-11-13 57 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