Удаление одного идентификатора из повторяющихся значений в Java

У меня есть строка со значением ниже:

String id = "21713|4 Pieces=50,21701|2 pieces=35,21701|250 Gram=30,21701|250 Gram=30,21701|250 Gram=30,";

Вышеуказанный идентификатор 21701|250 Gram=30повторился три раза. Все, что я хочу сделать, это, когда я нажимаю на кнопку удалить элемент, который будет проходить нет. из подсчетов, только что количество 21701|250 Gram=30должно быть удалено.

Как мы можем справиться с этим?

2 ответа

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

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

    IMHO иметь такую строку в приложении для начала кажется плохим дизайном. (если это не упражнение)

  2. Попробовать это.

    static String remove(String id, int countToRemove) {
        Set<String> set = Stream.of(id.split("(?<=,)"))
            .collect(Collectors.groupingBy(s -> s, Collectors.counting()))
            .entrySet().stream()
            .filter(e -> e.getValue() == countToRemove)
            .map(e -> e.getKey())
            .collect(Collectors.toSet());
        return Stream.of(id.split("(?<=,)"))
            .filter(s -> !set.contains(s))
            .collect(Collectors.joining());
    }
    

    И

    String id = "21713|4 Pieces=50,21701|2 pieces=35,21701|250 Gram=30,21701|250 Gram=30,21701|250 Gram=30,";
    System.out.println(remove(id, 3));
    

    результат:

    21713|4 Pieces=50,21701|2 pieces=35,
    

    В java7

    static String remove(String id, int countToRemove) {
        Map<String, Integer> map = new HashMap<>();
        for (String key : id.split("(?<=,)")) {
            Integer value = map.get(key);
            if (value == null)
                value = 0;
            map.put(key, value + 1);
        }
        Set<String> set = new HashSet<>();
        for (Entry<String, Integer> e : map.entrySet())
            if (e.getValue() == countToRemove)
                set.add(e.getKey());
        StringBuilder sb = new StringBuilder();
        for (String key : id.split("(?<=,)"))
            if (!set.contains(key))
                sb.append(key);
        return sb.toString();
    }