寻找一种有效的方法从List <string>中删除每个项目的一部分

时间:2019-05-02 21:26:34

标签: java-8

我有字符串项目列表,我正在尝试删除每个项目中的字符串部分,并使用它创建新列表。我可以使用下面的代码来实现它,但我认为将有一种使用流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,来自org.apache.commons的ListUtils

预期输出:

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

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

3 个答案:

答案 0 :(得分:2)

您可以使用正则表达式过滤掉不需要的值:

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 :(得分:1)

尝试使用删除

list.remove("Value1.1");

答案 2 :(得分:0)

        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);

我认为这是一个正确的解决方案,因为您仍然需要对数组中的每个字符串进行映射操作。然后只需将此项目“重新包装”为新字符串。