Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过分组**仅**相互相邻的重复元素,将列表拆分为子列表_Java_List_Java Stream_Groupingby - Fatal编程技术网

Java 通过分组**仅**相互相邻的重复元素,将列表拆分为子列表

Java 通过分组**仅**相互相邻的重复元素,将列表拆分为子列表,java,list,java-stream,groupingby,Java,List,Java Stream,Groupingby,是否有一种简单的方法将列表拆分为子列表,方法是只对彼此相邻的重复元素进行分组 具有以下字符串列表的简单示例: Input: [RED,RED,BLUE,BLUE,BLUE,GREEN,BLUE,BLUE,RED,RED] Output: [[RED,RED],[BLUE,BLUE,BLUE],[GREEN],[BLUE,BLUE],[RED,RED]] 如果我从java流中使用groupingBy,那么所有相等的元素都将在同一个子列表中结束,这是我想要避免的。有什么想法吗?我相信有更好的

是否有一种简单的方法将列表拆分为子列表,方法是只对彼此相邻的重复元素进行分组

具有以下字符串列表的简单示例:

Input:  [RED,RED,BLUE,BLUE,BLUE,GREEN,BLUE,BLUE,RED,RED]

Output:  [[RED,RED],[BLUE,BLUE,BLUE],[GREEN],[BLUE,BLUE],[RED,RED]]

如果我从java流中使用groupingBy,那么所有相等的元素都将在同一个子列表中结束,这是我想要避免的。有什么想法吗?

我相信有更好的方法来处理流,但对于快速和肮脏的:

List<String> values = Arrays.asList("RED", "RED", "BLUE", "BLUE", "BLUE", "BLUE", "RED", "RED");
    List<List<String>> output = new ArrayList<List<String>>();
    String previous = null;
    List<String> subList = new ArrayList<String>();
    for (String value : values) {
        if (previous == null || value.equals(previous)) {
            subList.add(value);
        } else {
            output.add(subList);
            subList = new ArrayList<String>();
            subList.add(value);
        }
        previous = value;
    }
    if (!subList.isEmpty()) {
        output.add(subList);
    }
    System.out.println(output);
列表值=数组。asList(“红色”、“红色”、“蓝色”、“蓝色”、“蓝色”、“红色”、“红色”);
列表输出=新的ArrayList();
字符串previous=null;
列表子列表=新的ArrayList();
for(字符串值:值){
if(previous==null | | value.equals(previous)){
子列表。添加(值);
}否则{
output.add(子列表);
subList=新的ArrayList();
子列表。添加(值);
}
先前=值;
}
如果(!subList.isEmpty()){
output.add(子列表);
}
系统输出打印项次(输出);

您可以创建自定义收集器:

List<String> input = Arrays.asList("RED", "RED", "BLUE", "BLUE", "BLUE", "BLUE", "RED", "RED");
List<List<String>> output = input.stream()
                                  .collect(Collector.of(ArrayList::new, (accumulator, item) ->
                                  {
                                      if(accumulator.isEmpty())
                                      {
                                          List<String> list = new ArrayList<>();
                                          list.add(item);
                                          accumulator.add(list);
                                      }
                                      else
                                      {
                                          List<String> last = accumulator.get(accumulator.size() - 1);
                                          if(last.isEmpty() || last.get(0).equals(item)) last.add(item);
                                          else
                                          {
                                              List<String> list = new ArrayList<>();
                                              list.add(item);
                                              accumulator.add(list);
                                          }
                                      }
                                  }, (left, right) -> {left.addAll(right); return left;}));
List输入=数组。asList(“红色”、“红色”、“蓝色”、“蓝色”、“蓝色”、“红色”、“红色”);
列表输出=输入。流()
.collect(Collector.of(ArrayList::new,(累加器,项)->
{
if(acculator.isEmpty())
{
列表=新的ArrayList();
列表。添加(项目);
添加(列表);
}
其他的
{
List last=acculator.get(acculator.size()-1);
if(last.isEmpty()| | last.get(0.equals(item))last.add(item);
其他的
{
列表=新的ArrayList();
列表。添加(项目);
添加(列表);
}
}
},(左,右)->{left.addAll(右);return left;});

我觉得它一点也不脏,对于像我这样的初学者来说很容易理解。非常感谢。我花了一段时间才明白发生了什么事。非常感谢你的帮助。你的代码最终肯定会出现在我作为初学者目前正在收集的代码片段集合中,以便为将来提供示例-