Ищете эффективный способ удаления части каждого элемента из списка <String> - PullRequest
5 голосов
/ 03 мая 2019

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

См., Например, ниже (упрощенно для объяснения)

    List<String> list = new ArrayList<String>();
    list.add("Value1.1,Value1.2,Value1.3,Value1.4,Value1.5,Value1.6");
    list.add("Value2.1,Value2.2,Value2.3,Value2.4,Value2.5,Vaule2.6");

    List<String> newList = list.stream().map(i -> {
            List<String> l = Arrays.asList(i.split(","));
            return StringUtils.join(ListUtils.sum(l.subList(0, 2),l.subList(4, l.size())),",");
            }).collect(Collectors.toList());

newList.forEach(System.out::println);
//    Value1.1,Value1.2,Value1.5,Value1.6
//    Value2.1,Value2.2,Value2.5,Value1.6

Постановка проблемы:

  • Ввод "список" (список строк)
  • Выполните итерацию каждого элемента в списке, разделите каждый элемент запятыми, добавьте 3-й и 4-й элемент и воссоедините строку
  • Создать новый список с новым строковым элементом

используется: StringUtils, ListUtils от org.apache.commons

Ожидаемый результат:

Value1.1, Value1.2, Value1.5, Value1.6

Value2.1, Value2.2, Value2.5, Value2.6

Ответы [ 3 ]

2 голосов
/ 03 мая 2019

Вы можете использовать регулярное выражение для фильтрации нежелательных значений:

String pattern = "^([^,]*,[^,]*)(,[^,]*,[^,]*)(.*)$"
/** Explnation:
^              :start of line
(...)          :group capture
[^,]           :all characters which aren't ','
*              :zero or more times
,              :single comma
.              :any character
$              :end of line

([^,]*,[^,]*)  :first capture group ($1), two words seperated by ','
(,[^,]*,[^,]*) :second capture group ($2), the values we want to remove
(.*)           :third capture group ($3), all the rest of the string
**/

Pattern patternCompiled = Pattern.compile(pattern);
List<String> newList = list.stream()
                      .map(i -> patternCompiled.matcher(i).replaceAll("$1$3"))
                      .collect(Collectors.toList());
1 голос
/ 03 мая 2019

попробуйте использовать удаление,

list.remove("Value1.1");

0 голосов
/ 03 мая 2019
        List<String> list = new ArrayList<>();
        list.add("Value1.1,Value1.2,Value1.3,Value1.4,Value1.5,Value1.6");
        list.add("Value2.1,Value2.2,Value2.3,Value2.4,Value2.5,Vaule2.6");

        List<String> newList = list.stream().map(i ->
            Arrays.stream(i.split(","))
                    .filter(s -> s.endsWith("1") || s.endsWith("2") || s.endsWith("5"))
                    .collect(Collectors.joining(","))
        ).collect(Collectors.toList());

        newList.forEach(System.out::println);

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

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