Как проверить hashset для существующего элемента и затем добавить счетчик - PullRequest
0 голосов
/ 05 марта 2019

Я новичок в Java и начинаю учиться использовать хэш-наборы. У меня проблема с тренировочными упражнениями. Цель состоит в том, чтобы удалить дублирующееся описание и затем добавить количество похожих описаний.

Например, у меня есть,

Информатика - 15
Машиностроение - 20
Стоматология - 10
Архитектура - 11
Информатика - 25
Стоматология - 7

тогда вывод должен быть только:

Информатика - 40
Машиностроение - 20
Стоматология - 17
Архитектура - 11

import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.Arrays;

public class Main {
  public static void main(String[] args) {
    //printing summary report
    ArrayList<String>   summaryReport=  new ArrayList<String>();

    final String[] CourseDesc           = {"Computer Science", "Architecture", "Dentistry", "Computer Science"};
    final int[] CourseCount         = {15, 10, 10, 25};

    for (String element: CourseDesc) {
        for(int el: CourseCount){
             summaryReport.add(element + " "+ el);
        }
     }
   System.out.println(summaryReport);
  }
}

Я просто застрял в том, как добавить количество похожих описаний. Спасибо!

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

Умный способ решить вашу проблему - использовать потоки Java:

final String[] courseDesc = {"Computer Science", "Engineering", "Dentistry", "Architecture", "Computer Science", "Dentistry"};
final int[] courseCount = {15, 20, 10, 11, 25, 7};

Map<String, Integer> summaryReport = IntStream.range(0, courseDesc.length).boxed()
    .collect(Collectors.toMap(
        index -> courseDesc[index], index -> courseCount[index],
        (count0, count1) -> count0 + count1, LinkedHashMap::new
    ));

Это создает карту с курсом в качестве ключа и суммой в качестве значения.Если карта содержит курс и этот же курс собирается снова, лямбда-выражение (count0, count1) -> count0 + count1 обрабатывает его путем суммирования значений.LinkedHashMap::new - для поддержания порядка.

Теперь вы можете распечатать сводку следующим образом:

summaryReport.forEach((course, count) -> System.out.println(course + " - " + count));

Результат:

Computer Science - 40
Engineering - 20
Dentistry - 17
Architecture - 11
0 голосов
/ 05 марта 2019

Из OP я вижу, что вам нужен контейнер значения ключа ассоциации, поэтому наиболее очевидным способом будет использование Map, проверьте, присутствует ли значение в качестве ключа, если нет - добавьте его с 1 counter если есть - добавить + 1:

void test() {
    Map<String, Integer> summaryReport = new HashMap<>();
    String curDesc = "whatever";

    Integer count = summaryReport.get(curDesc);
    if (count == null) {
        summaryReport.put(curDesc, 1);
    } else {
        summaryReport.put(curDesc, count + 1);
    }
}

Делая более хитрым способом, вы можете использовать изменяемый AtomicInteger в качестве счетчика:

void test() {
    Map<String, AtomicInteger> summaryReport = new HashMap<>();
    AtomicInteger counter = summaryReport.putIfAbsent("whatever", new AtomicInteger(0));
    if (counter != null) {
        counter.incrementAndGet();
    }
}
...