Java находит дубликаты строк в массиве и добавляет соответствующие значения int - PullRequest
0 голосов
/ 15 мая 2019

Я немного новичок в программировании и борюсь с этой задачей. У меня есть таблица с именами (строки) и соответствующие значения (INT). Теперь я ищу дубликаты в именах и добавляю значения int, если имя уже существует в таблице.

У меня есть смутное представление о том, как я могу это сделать, но я также уверен, что это не идеальное решение проблемы. Я пытаюсь оптимизировать результаты, которые я получаю. Моя идея состоит в том, чтобы использовать 2 массива, один для имен и один для чисел, если в массиве есть повторяющееся имя, я перейду к той же позиции в массиве чисел и добавлю соответствующие числа. Моя первоначальная идея выглядит так:

String[] names = {a,b,a,a,c,b};
Integer[] numbers = {5,2,3,1,2,1};

for (int i = 0; i < names.length; i++) {
    for (int j = i + 1; j < names.length; j++) {
        if (names[i].equals(names[j]) ) {
           numbers[i] += numbers[j]
        } System.out.println("Name: " + names[i] + " Amount: " + numbers[i])
    }
}

Предполагаемый результат должен быть примерно таким: a = 10 b = 3 c = 1

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

Ответы [ 5 ]

0 голосов
/ 15 мая 2019

Использование карты будет достаточно для вашего требования.Это можно сделать следующим образом:

String [] names = {"a", "b", "a", "a", "c", "b"};

Целое число[] numbers = {5, 2, 3, 1, 2, 1};

Карта ожидаемого выхода = новый HashMap ();

for (int i = 0; i < names.length; i++) {
  if (expectedOut.containsKey(names[i]))
    expectedOut.put(names[i], expectedOut.get(names[i]) + numbers[i]);
  else
    expectedOut.put(names[i], numbers[i]);
}

for (Map.Entry<String, Integer> out : expectedOut.entrySet())
  System.out.println(out.getKey() + " = " + out.getValue());

}

0 голосов
/ 15 мая 2019

Вот рабочий пример:

import java.util.HashMap;
import java.util.Map;

public class Main {
    public static void main(String[] args) {
        String[] names = {"a","b","a","a","c","b"};
        Integer[] numbers = {5,2,3,1,2,1};

        Map<String, Integer> occurrences = new HashMap<>();
        for(int i = 0; i < names.length; ++i) {
            String key = names[i];
            Integer previousNumber = occurrences.getOrDefault(key, 0);  //Previously stored number
            Integer correspondingNumber = numbers[i];   //Delta for specified name
            occurrences.put(key, previousNumber + correspondingNumber); //Storing new value
        }

        //Print result
        occurrences.forEach((key, value) -> System.out.println("Name: " + key + " Amount: " + value));
    }
}

Карты позволяют вам присвоить какое-то значение некоторому уникальному ключу.Говорят, что обычно операции размещения / поиска в Картах имеют временную сложность O (1), что делает их идеальным решением вашей проблемы.Самая базовая реализация - это HashMap, но если вы хотите сохранить порядок имен при итерации, просто используйте LinkedHashMap.С другой стороны, если вы хотите, чтобы ваши данные сортировались каким-либо образом, вы, вероятно, будете использовать TreeMap.

РЕДАКТИРОВАТЬ: Как Шарон Бен Ашер упоминал в разделе комментариев ниже, вы можете использовать метод merge ()чтобы сократить код:

import java.util.HashMap;
import java.util.Map;

public class Main {
    public static void main(String[] args) {
        String[] names = {"a","b","a","a","c","b"};
        Integer[] numbers = {5,2,3,1,2,1};

        Map<String, Integer> occurrences = new HashMap<>();
        for(int i = 0; i < names.length; ++i)
            occurrences.merge(names[i], numbers[i], Integer::sum);

        //Print result
        occurrences.forEach((key, value) -> System.out.println("Name: " + key + " Amount: " + value));
    }
}

Но я немного разбил его в первом ответе, просто чтобы дать вам лучшее объяснение того, как работают карты.В основном вы используете такие методы, как get () (getOrDefault () является его вариантом, который возвращает значение, даже если сопоставление не найдено для данного ключа) и put () позволяют вам зафиксировать новое сопоставление / переопределение, существующее для данного ключа.

0 голосов
/ 15 мая 2019

Вы можете использовать Древовидную карту, чтобы содержать дублирование и общую сумму, соответствующую вашей входной строке.Также используя treemap, ваш вывод будет в отсортированном формате, если вам нужно.

public static void main(String[] args) {

  String[] names = {"a","b","a","a","c","b"};
  Integer[] numbers = {5,2,3,1,2,1};
  Map<String, Integer> map = new TreeMap<>();

  for (int i = 0; i < names.length; i++) {
    if (!map.containsKey(names[i])) {
      map.put(names[i], 0);
    }
    map.put(names[i], map.get(names[i]) + numbers[i]);
  }

  for (String key : map.keySet()) {
    System.out.println( key +" = " + map.get(key));
  }
}

Вывод приведенного выше кода будет (как указано @vincrichaud):

a = 9
b = 3
c = 2
0 голосов
/ 15 мая 2019

Я уже предложил это в комментариях: Вы можете использовать карту для подсчета всех значений.
Вот пример намеренно подробный (чтобы прояснить, что происходит):

    String[] names = {"a","b","a","a","c","b"};
    Integer[] numbers = {5,2,3,1,2,1};

    Map<String, Integer> totals = new HashMap<String, Integer>(); 

    for (int i = 0; i < names.length; i++) {
        if (totals.containsKey(names[i])) {
            totals.put(names[i], totals.get(names[i]) + numbers[i]);
        } else {
            totals.put(names[i], numbers[i]);
        }
    }

    System.out.println(totals);

Так что, если имя уже есть на карте, просто увеличьте счет на новый номер. Если это не так, добавьте новую запись карты с номером.
Помните, что для того, чтобы это работало, ваши два массива должны быть одинаковой длины!

Это напечатает:

{a=9, b=3, c=2}
0 голосов
/ 15 мая 2019

Вы можете использовать интерфейс карты. Используйте ваш строковый массив "names" в качестве ключей. Напишите цикл for для него и внутри: Если ваша карта содержит ключ, получите значение и сумму с новым значением.

PS: не могу написать код прямо сейчас, я могу обновить его позже.

...