Удаление повторяющихся элементов в ArrayList и добавление общего количества вхождений в скобках после первого элемента - PullRequest
4 голосов
/ 22 марта 2012

Начинающий здесь.У меня есть String ArrayList, который, по сути, выглядит следующим образом (но с изменением значений в зависимости от пользовательского ввода) при печати:

[22, 37, 77, 77, 98, 101, 104, 107, 107, 107,150]

Я хочу удалить дубликаты элементов и добавить общее количество вхождений в скобках после первого элемента, чтобы оно выглядело так:

[22, 37, 77 (2), 98, 101, 104, 107 (3), 150]

Я выяснил, как удалить дублирующиеся элементы, но не могу разобраться с остальными.

Вот мой код (ArrayList называется дубликатами):

int q, z;
for(q = 0; q < duplicates.size() - 1; q++) {  
    for(z = q + 1; z < duplicates.size() - 1; z++) {
        if(duplicates.get(q).equals(duplicates.get(z))) {
            duplicates.remove(q);
        }
    }
}

System.out.println(duplicates);

В результате получается:

[22, 37, 77, 98, 101, 104, 107, 150]

Кто-нибудь есть какие-либо предложения о том, как я могу получить эти скобки с количеством вхождений там?Я изо всех сил пытался придумать способ подсчета удаленных дубликатов для каждого значения, но я смог подсчитать только общее количество удаленных дубликатов за период, что не особенно полезно.

ArrayList изначально был Integer ArrayList, но я изменил его на String ArrayList, чтобы я мог добавлять в элементы нечисловые символы.

Ответы [ 8 ]

2 голосов
/ 22 марта 2012

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

initialize a map of appropriate size and type
iterate the array to be processed. for each element in array:

set key:= current element in array
set value := value from map corresponding to key
if value is null, initialize value to 1
store value for key in map

Затем в конце вы переберите ключи карты и распечатаете ключ и соответствующее ему значение.HashMap

Получение значений с карты Сохранение значений на карте
1 голос
/ 22 марта 2012

ArrayList изначально был Integer ArrayList, но я изменил его на String ArrayList, чтобы я мог добавлять в элементы нечисловые символы.

Это ошибка.Не путайте, как вы хотите сохранить свои данные в своем коде и как вы хотите отобразить их для пользователя.Если вы сохраняете свои значения как List из String, вы сами усложняете ситуацию.Сохраняйте значения в форме, которую проще всего кодировать, и преобразуйте в строки только после того, как вы захотите их отобразить.

Итак, вы хотите получить список уникальных чисел и подсчитать для каждого из них.Map было бы идеально, поскольку оно сопоставляет ключ - в вашем случае целое число - со значением - счетчиком.

Так что вам нужно перебрать свои числа и затем считать их в Map.В приведенном ниже коде я предполагаю, что list - это List<Integer>.

Map<Integer,Integer> counts = new HashMap<Integer,Integer>();

for (int number : list) {
  int count = counts.containsKey(number) ? counts.get(number) : 0;
  count += 1;
  counts.put(number,count);
}

Затем вы можете создать свой вывод, выполнив цикл по Map.keySet() или Map.entrySet(),

0 голосов
/ 29 марта 2014
List<Integer> completeList = new ArrayList<Integer>();
completeList.add(22);
completeList.add(22);
completeList.add(37);
completeList.add(77);
completeList.add(77);
completeList.add(98);
completeList.add(101);
completeList.add(107);
completeList.add(107);
completeList.add(107);
completeList.add(150);

System.out.println(completeList);

// Using a sortedSet to remove the duplicates
SortedSet<Integer> nonDupSet = new TreeSet<Integer>(completeList);
System.out.println(nonDupSet);

List<String> datawithParan = new ArrayList<String>();
//Looping through the completeList with the nonDup List and counting the dups.
// and then populating a List with the required Format
for (Integer nonDup: nonDupSet) {
    int count = 0;
    for (Integer complete: completeList) {                      
      if(nonDup == complete) {
        count++;
      }
    }

    datawithParan.add(nonDup +"(" + count + ")");
}
System.out.println(datawithParan);
0 голосов
/ 06 июля 2013

С небольшой помощью (ИМХО очень полезно) библиотеки Google Гуава вы можете написать это:

List<String> duplicate = ImmutableList.of("22", "37", "77", "77", "98", "101", "104", "107", "107", "107", "150");

System.out.println(duplicate); 

Multiset<String> withoutDuplicate = LinkedHashMultiset.create();
withoutDuplicate.addAll(duplicate);

System.out.println(withoutDuplicate); 

Это приведет к

[22, 37, 77, 77, 98, 101, 104, 107, 107, 107, 150]
[22, 37, 77 x 2, 98, 101, 104, 107 x 3, 150]

Это не совсемВаш формат, но для этого это двухслойный.

0 голосов
/ 22 марта 2012

Вот полный код для вас:

public static void main(String[] args) {
    /* Make list */
    List<String> input = new ArrayList<String>();
    input.add("12");
    input.add("11");
    input.add("11");
    input.add("12");
    input.add("12");
    input.add("15");
    input.add("12");
    input.add("17");
    input.add("18");
    input.add("11");

    /*
     * count duplicates
     */
    Map<String, Integer> map = new LinkedHashMap<String, Integer>();
    for (String str : input) {
        if (map.containsKey(str)) {
            Integer prevCount = map.get(str);
            map.put(str, ++prevCount);
        } else {
            map.put(str, 0);
        }
    }

    /*
     * make string to display
     */
    StringBuffer sb = new StringBuffer();
    for (Map.Entry<String, Integer> entry : map.entrySet()) {

        String key = entry.getKey();
        Integer count = entry.getValue();
        if (count == 0) {
            sb.append(key + ", ");
        } else
            sb.append(key + "(" + count + "), ");
    }
    String tmp = sb.toString();
    String output = tmp.substring(0, tmp.length() - 2); //remove last ", "
    System.out.println("[" + output + "]");

}
0 голосов
/ 22 марта 2012

LinkedHashMap достаточно хорош для вас.Реализация хэш-таблицы и связанного списка интерфейса Map с предсказуемым порядком итераций.Поэтому я рекомендую использовать LinkedHashMap следующим образом:

    public static LinkedHashMap<String,Integer> removeDuplicate(List<String> list)
{
    LinkedHashMap<String,Integer> map = new LinkedHashMap<String,Integer>();
    for(String str:list)
    {
        Integer count = map.get(str);
        if(count == null)
        {
            map.put(str, 1);
        }else{
            map.put(str, ++count);
        }
    }
    return map;
}

public static void main(String[] args)
{
    List<String> list = new ArrayList<String>();
    list.add("123");
    list.add("45");
    list.add("678");
    list.add("123");
    System.out.println(removeDuplicate(list));
}
0 голосов
/ 22 марта 2012

объявите ArrayList<Integer> для подсчета:

ArrayList<Integer> counts = new ArrayList<Integer>();

, а затем, когда вы удалите дубликат, увеличьте счет

            duplicates.remove(q);
            counts.set(q, counts.get(q) + 1);
0 голосов
/ 22 марта 2012

Прежде всего, я предлагаю вам сохранить список в виде списка целых чисел.Не используйте System.out.println(duplicates), но сделайте цикл самостоятельно.В любом случае это действительно легко.

Подсчет вхождений:

Я предлагаю вам сохранить Map<Integer, Integer>, который сопоставляет числа с числом вхождений.Это можно инициализировать в первом проходе следующим образом:

  1. Для каждого элемента i в списке (for (int i : duplicates))
    1. Если i отсутствует на карте (map.containsKey(i))
      1. добавить отображение i -> 0 (map.put(i, 0))
    2. Увеличитьзначение для ключа i (map.put(i, map.get(i) + 1))

Печать списка с количеством вхождений:

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

  1. Создать HashSet<Integer> printed дляуже напечатанные числа
  2. Для каждого элемента i в списке
    1. Если i равно printed, выполните, продолжите: (if (printed.contains(i)) continue;)
    2. Печать i
    3. Если отображение имеет значение> 1 для i , выведите число в скобках
    4. Добавить я на печать.(printed.add(i))

После того, как вы закончили петли, вы можете удалить дупла, просто выполнив

list = new ArrayList<Integer>(new LinkedHashSet<Integer>(list));
...