Как я могу удалить значения, которые дублируются в массиве? - PullRequest
0 голосов
/ 08 октября 2019

У меня ниже ArrayList

["P", "a", "y", "P", "a", "l", "I", "n", "d", "i", "a"]

Ожидаемый результат [y, l, I, n, d, i]

Я хочу удалить все дубликаты, включая исходное значение. Например: «P» является дубликатом. Если я использую set, он удалит дубликаты и отобразится один «P». Я хочу удалить все 'P'.

Я пробовал код ниже. Но это проверка, только если есть даже набор символов,

ArrayList<Character> unique = new ArrayList<Character>();
for (Character c : b) {
    if (unique.contains(c)) {
        unique.remove(c);
    } else {
        unique.add(c);
    }
}

Этот код проверяет и удаляет «P», но не «a». Потому что "а" в списке 3 т

Ответы [ 5 ]

3 голосов
/ 08 октября 2019

Сначала он считает вхождения каждого символа, а затем отфильтровывает по количеству вхождений (только с одним вхождением).

List<Character> input = Arrays.asList('P', 'a', 'y', 'P', 'a', 'l', 'I', 'n', 'd', 'i', 'a');

List<Character> collect = input.stream()
    .collect(Collectors.groupingBy(p -> p, Collectors.counting()))
    .entrySet().stream()
    .filter(e -> e.getValue() == 1)
    .map(Map.Entry::getKey)
    .collect(Collectors.toList());

System.out.println(collect);

Старая версия без потоков может быть записана так:

// create Map with count occurence
Map<Character, Integer> countMap = new HashMap<>();
for (Character value : input) {
    if (!countMap.containsKey(value)) {
        countMap.put(value, 1);
    } else {
        countMap.put(value, countMap.get(value) + 1);
    }
}

// filter Map
List<Character> collect = new ArrayList<>();
for (Map.Entry<Character, Integer> value : countMap.entrySet()) {
    if( value.getValue() == 1)  {
        collect.add(value.getKey());
    }
}

System.out.println(collect);

1 голос
/ 08 октября 2019

Попробуйте этот подход:

public static void main(String[] args) {
    List<Character> unique = Arrays.asList('P', 'a', 'y', 'P', 'a', 'l', 'I', 'n', 'd', 'i', 'a');
    List<Character> result = unique.stream().filter(i1 -> unique.stream().filter(i2 -> i1.equals(i2)).count() == 1).collect(Collectors.toList());
    System.out.println(result);
}

Вывод: [y, l, I, n, d, i]

0 голосов
/ 08 октября 2019

Это может помочь

import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

public class RemoveDuplicates {
public static void main(String[] args) {

    String string = "PayPalIndia";

    List<Character> strings = string.chars().mapToObj(c -> (char) c).collect(Collectors.toList());
    Set<Character> set = new HashSet<>();

    Iterator<Character> iterator = strings.iterator();
    Set<Character> invalid = new HashSet<>();
    while (iterator.hasNext()) {
        Character c = iterator.next();
        if (set.contains(c)) {
            iterator.remove();
            invalid.add(c);
        } else {
            set.add(c);
        }
    }
    System.out.println("Duplicate parents");
    invalid.forEach(System.out::print);
    System.out.println();
    strings.removeAll(invalid);

    System.out.println("=============");
    System.out.println("After removing Duplicates...");
    strings.forEach(System.out::print);
    System.out.println();
}

}

0 голосов
/ 08 октября 2019

Попробуйте это

ArrayList charsList = new ArrayList <> (Arrays.asList ('P', 'a', 'y', 'P', 'a', 'l', 'I', 'n', 'd', 'i', 'a'));

List listWithoutDuplicates = charsList.stream (). different (). collect (Collectors.toList ());

0 голосов
/ 08 октября 2019

Интересный способ сделать это без потоков Java 8 - создать массив int размером 128, в котором будет храниться счетчик каждого вхождения в индексе значения символа.

ДляНапример, если a появится 3 раза, array[97] будет равно 3, где 97 - это значение Ascii a (я знаю, что технически ascii не используется).

Недостатокэта реализация не может обрабатывать любые другие символы выше первых 128 символов в таблице ascii. Хотя вы можете расширить его соответствующим образом.

Вот как это будет выглядеть:

public static void main(String[] args) {
    ArrayList<Character> list = new ArrayList<>();
    list.add(Character.valueOf('P'));
    list.add(Character.valueOf('t'));
    list.add(Character.valueOf('L'));
    list.add(Character.valueOf('L'));
    list.add(Character.valueOf('b'));
    list.add(Character.valueOf('P'));
    list.add(Character.valueOf('c'));


    int [] lookup = new int[128];

    //Build the lookup table
    for (char c : list) {
        lookup[c]++;
    }

    //Remove the values that are greater than 1 in the lookup table
    for (int j = 0; j < lookup.length; j++) {
        int count = lookup[j];
        for (int k = 0; k < count && count > 1; k++) {
            list.remove(Character.valueOf((char) j));
        }
    }
}

Код в основном разбит на две основные части:

  • Построение справочной таблицы.

  • Удаление значений из списка с использованием справочной таблицы в качестве справочного.

Теперь это, очевидно, сложнее, чемрешение с Map, Set, или с использованием потоков, было бы, но я решил, что с вашими требованиями вы также не сможете использовать поток.

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