Как сравнить две карты по их значениям и вывести максимальное значение для каждого ключа (ключ является общим для обеих карт) - PullRequest
0 голосов
/ 26 июня 2018
void displayFeedback(){
    Map<String, Integer> maths = new HashMap<String, Integer>();
    maths.put("Nirmala", 70);
    maths.put("Subaksha", 80);
    Map<String, Integer> english = new HashMap<String, Integer>();
    english.put("Nirmala", 75);
    english.put("Subaksha", 60);
    //same staffs taking two different subjects maths and english 
    //values taken as feedback for each subject
    // i need to compare both subject feedback and print only max as o/p
    System.out.println(maths);
    System.out.println(maths.entrySet());
    //maths.
    //maths.entrySet();
    //Collections.max(coll, comp)
    Map<String, Integer> top = new HashMap<String, Integer>();
    System.out.println(maths.size());
    for (Map.Entry<String, Integer> math: maths.entrySet()){
        for (Map.Entry<String, Integer> eng: english.entrySet()){   
        //for(int i = 0;i<maths.size();i++){
            //math.comparingByValue()
            System.out.println(math.getValue()+" "+eng.getValue());
            //Collections.max(math.getValue(), eng.getValue());
        if(math.getValue() <= eng.getValue()){
            //System.out.println(" math <= eng");

        }else
        {
            //System.out.println("math > eng");
        }

Учителя часто встречаются на обеих картах, они занимаются как математикой, так и предметом изучения. и их обратная связь в каждом предмете, полученная как значения для обоих субъектов

Мне нужно сравнить и найти максимальное значение обратной связи и вывести только максимальное значение для каждый учитель .... т Учитель является общим ключом в обеих картах

Ответы [ 6 ]

0 голосов
/ 27 июня 2018

Если вы уверены, что получите отзыв для каждого учителя по каждому предмету, вы можете использовать следующее.

Map<String, Integer> maths = new HashMap<String, Integer>();
maths.put("T1", 75);
maths.put("T2", 68);
maths.put("T3", 80);

Map<String, Integer> english = new HashMap<String, Integer>();
english.put("T1",60);
english.put("T2",70);
english.put("T3",79);

for(String s:maths.keySet())
    System.out.println("Teacher "+s+" with max feedback:"+Math.max(maths.get(s),english.get(s)));
0 голосов
/ 26 июня 2018

Вы можете создать вспомогательную коллекцию для каждого ключа учителя (Map<String, Collection<Integer>>), которую вы заполняете, перебирая обе существующие карты и затем добавляя в них оценки.

Или вы можете создать поток Java 8 поверх обоих наборов записей карты, а затем объединить их в одну карту, вызвав утилиты Collectors:

Map<String, Optional<Integer>> data = Arrays.asList( map1.entrySet(), map2.entrySet() )
            .stream()
            .flatMap( Set::stream )
            .collect( Collectors.groupingBy( Entry::getKey, HashMap::new, Collectors.mapping( Entry::getValue, Collectors.maxBy( Integer::compare ) ) ) );

    for( Entry<String, Optional<Integer>> entry : data.entrySet() )
    {
        System.out.println( entry.getKey() + ": " + entry.getValue().orElse( 0 ) );
    }
0 голосов
/ 26 июня 2018

Вы можете сделать следующее:

1. строит map из предметов, так как ключ - учитель , а - все его ответные реакции

Map<String, List<Integer>> feedbacks = 
                           Stream.of(maths, english)
                                 .flatMap(map -> map.entrySet().stream())
                                 .collect(Collectors.toMap(e -> e.getKey(), 
                                              e -> new ArrayList<Integer>(Arrays.asList(e.getValue())), 
                                             (l1, l2)-> {l1.addAll(l2); return l1;}));

System.out.println(feedbacks); //{Subaksha=[80, 60], Nirmala=[70, 75]}

2. строит map из отзывов, поскольку ключ - учитель , а значение - максимум его обратной связи

Map<String, Integer> maxs = feedbacks.entrySet().stream()
               .collect(Collectors.toMap(e->e.getKey(),
                                         e-> e.getValue().stream().max(Integer::compare).get()));

System.out.println(maxs);     //{Nirmala=75, Subaksha=80}
0 голосов
/ 26 июня 2018

Вот мое предположение;)

private void printMaxValues(Map<String, Integer> first, Map<String, Integer> second) {
    Set<String> keys = first.keySet();
    for (String s : keys) {
        Integer val1 = first.get(s);
        Integer val2 = second.get(s);
        if (val1 == null && val2 == null) {
            System.out.println("No values for key: " + s);
        } else if (val1 == null) {
            System.out.println(s + "=" + val2);
        } else if (val2 == null) {
            System.out.println(s + "=" + val1);
        } else {
            System.out.println(s + "=" + Math.max(val1, val2));
        }
    }
}
0 голосов
/ 26 июня 2018

вы можете получить значение карты обратной связи на английском языке с помощью математического ключа итератора entrySet () и выбрать максимальное значение

        Map<String, Integer> maths = new HashMap<String, Integer>();
        maths.put("Nirmala", 70);
        maths.put("Subaksha", 80);
        Map<String, Integer> english = new HashMap<String, Integer>();
        english.put("Nirmala", 75);
        english.put("Subaksha", 60);

        System.out.println(english.entrySet());
        System.out.println(maths.entrySet());

        Map<String, Integer> top = new HashMap<String, Integer>();
        for (Map.Entry<String, Integer> math: maths.entrySet()){    
            System.out.println( "Teacher : " +math.getKey() + " Max Feedback :" + Math.max(math.getValue(), english.get(math.getKey())));
          }
0 голосов
/ 26 июня 2018

Вы можете попробовать что-то вроде:

static <V extends Comparable<V>>
boolean valuesEquals(Map<?,V> map1, Map<?,V> map2) {
    List<V> values1 = new ArrayList<V>(map1.values());
    List<V> values2 = new ArrayList<V>(map2.values());
    Collections.sort(values1);
    Collections.sort(values2);
    return values1.equals(values2);
}

или

map1.keySet().equals(map2.keySet())

для сравнения значений.И если равно равно true, то вы найдете больший ключ из двух значений.

См .: http://thelogofthewook.blogspot.com/2011/12/hashmap-comparison-how-to-compare-two.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...