当前位置: 首页 > 知识库问答 >
问题:

按元素将列表拆分为块

叶富
2023-03-14

我有一个对象(Pos)与此模型的集合:

public class Pos {
    private String beforeChangement;
    private String type;
    private String afterChangement;
}

对象列表如下所示:

[
Pos(beforeChangement=Découvrez, type=VER, afterChangement=découvrir), 
Pos(beforeChangement=un, type=DET, afterChangement=un),
Pos(beforeChangement=large, type=ADJ, afterChangement=large), 
Pos(beforeChangement=., type=SENT, afterChangement=.), 
Pos(beforeChangement=Livraison, type=NOM, afterChangement=livraison), 
Pos(beforeChangement=et, type=KON, afterChangement=et), 
Pos(beforeChangement=retour, type=NOM, afterChangement=retour), 
Pos(beforeChangement=., type=SENT, afterChangement=.), 
Pos(beforeChangement=achetez, type=VER, afterChangement=acheter), 
Pos(beforeChangement=gratuitement, type=ADV, afterChangement=gratuitement), 
Pos(beforeChangement=., type=SENT, afterChangement=.), 
Pos(beforeChangement=allez, type=VER, afterChangement=aller), 
Pos(beforeChangement=faites, type=VER, afterChangement=faire), 
Pos(beforeChangement=vite, type=ADV, afterChangement=vite), 
Pos(beforeChangement=chers, type=ADJ, afterChangement=cher), 
Pos(beforeChangement=clients, type=NOM, afterChangement=client)]
Pos(beforeChangement=., type=SENT, afterChangement=.)
]

我想按beforeChangement或afterChangement==”字段拆分此对象列表要使用此格式(列表列表)List

[

[Pos(beforeChangement=Découvrez, type=VER, afterChangement=découvrir), 
Pos(beforeChangement=un, type=DET, afterChangement=un),
Pos(beforeChangement=large, type=ADJ, afterChangement=large)],

[Pos(beforeChangement=Livraison, type=NOM, afterChangement=livraison), 
Pos(beforeChangement=et, type=KON, afterChangement=et), 
Pos(beforeChangement=retour, type=NOM, afterChangement=retour)],

[Pos(beforeChangement=achetez, type=VER, afterChangement=acheter), 
Pos(beforeChangement=gratuitement, type=ADV, afterChangement=gratuitement)],


[Pos(beforeChangement=allez, type=VER, afterChangement=aller), 
Pos(beforeChangement=faites, type=VER, afterChangement=faire), 
Pos(beforeChangement=vite, type=ADV, afterChangement=vite), 
Pos(beforeChangement=chers, type=ADJ, afterChangement=cher), 
Pos(beforeChangement=clients, type=NOM, afterChangement=client)]

]

就像执行一个反平面图,在被一个对象字段(字符串)分裂后,有一个数组列表或列表(块)

你知道如何使用流吗?

谢谢你们


共有3个答案

杜茂
2023-03-14

嗯,我在这里会比较保守,我不会使用Streams(尽管这是可能的)。

以下代码段执行您需要的操作:

List<Pos> posList;
List<List<Pos>> result = new ArrayList<>();
boolean startNewSentence = true;
for (Pos pos : posList) {
    if (startNewSentence) {
        result.add(new ArrayList<>());
    }
    startNewSentence = isPeriod(pos);
    if (!startNewSentence) {
        result.get(result.size() - 1).add(pos);
    }
}

哪里:

boolean isPeriod(Pos pos) {
    return ".".equals(pos.beforeChangement()) || ".".equals(pos.afterChangement());
}

附言。注意英语中没有“改变”这个词。动词“改变”中的名词也是“改变”。

曾昂然
2023-03-14

使用StreamEx库,您可以使用group Runs方法将列表拆分为列表。

例如:

List<List<Pos>> collect = StreamEx.of(originalList.stream())
            .groupRuns((p1, p2) -> !(".".equals(p2.beforeChangement) || ".".equals(p2.afterChangement)))
            .collect(Collectors.toList());

方法groupRuns返回列表的Stream。在上面的例子中,它列出了第一个带有元素

以后可以过滤掉这些元素。例如,使用map方法:

StreamEx.of(originalList.stream())
            .groupRuns((p1, p2) -> !(".".equals(p2.beforeChangement) || ".".equals(p2.afterChangement))) // returns Stream of lists with '.' element
            .map(l -> l.stream()
                        .filter(p -> !(".".equals(p.beforeChangement) || ".".equals(p.afterChangement))) //filter out element with '.'
                        .collect(Collectors.toList()))
            .filter(l -> !l.isEmpty()) // filter out empty lists
            .collect(Collectors.toList());

西门高歌
2023-03-14

嗯,我想用这样一个简单的循环来解决你的问题:

List<List<Pos>> result = new ArrayList<>();
List<Pos> part = new ArrayList<>();
for(Pos pos : listPos){
    if(pos.getBeforeChangement().equals(".") || pos.getAfterChangement().equals(".")){
        result.add(part);//If the condition is correct then add the sub list to result list
        part = new ArrayList<>();// and reinitialize the sub-list
    } else {
        part.add(pos);// else just put the Pos object to the sub-list
    }
}
//Just in case the listPos not end with "." values then the last part should not be escaped
if(!part.isEmpty()){
    result.add(part);
}

注意,问题是不够清楚,你的对象类命名为SOP,对象列表是Pos哪一个是正确的,在我的答案中,我基于公共类Pos{...}而不是公共类SOP{...}

  • 看一下Ideone演示
 类似资料:
  • 问题:如何将列表拆分为两个子列表,其中元素由元素中的选项卡分隔? 上下文:我想读取一个由制表符分隔的文件到Pandas DataFrame中。这些文件看起来像: 列1\t 123 列2\t 列3\t文本 这意味着每行有一列,后面跟着一个选项卡,然后是该列的一个值(有时没有值)。 我的想法是读取文件并将每行保存为列表的元素,然后将列表分成两个,将选项卡前的第一部分作为一个列表,选项卡后的第二部分作为

  • 问题内容: 我有这个清单(): 我想要这样的东西: 换句话说,我想使用值作为分隔符将列表拆分为子列表,以获得列表列表()。我正在寻找Java 8解决方案。我已经尝试过,但是我不确定这是我要找的东西。谢谢! 问题答案: 我目前想出的唯一解决方案是实现自己的自定义收集器。 在阅读解决方案之前,我想添加一些有关此的注释。我将这个问题更多地当作编程练习,我不确定是否可以使用并行流来完成。 因此,您必须意识

  • 我有一个包含字典作为元素的单列的。这是以下代码的结果: 我需要将此列拆分为尽可能多的列(我有太多的行和列,并且我无法更改函数),因此输出将是一个包含列,,的数据帧,<代码>功能50。这样做的最佳方式是什么? 一个具体而简单的例子: 但当我尝试用pd.Series或pd.DataFrame包装它时,它说如果数据是标量值,则必须提供索引。提供索引=['feature1','feature2'],我会得

  • 我有UCI数据仓库中的胸部手术数据集 此数据集中的一行如下所示: 我有一个脚本可以将这些行读入子列表: 每个子列表都是文件中的一行,包含一些数据转换(大多数情况下,只是将行中的每个元素转换为一些数值;这部分与问题无关) 因此,每个子列表如下所示: 现在,我想做的是将这个子列表转换为两个子列表,其中: 第一个列表的th子列表包含所有元素,但原始列表的th子列表的最后一个元素除外 第二个列表的第一个子

  • 我在csv文件中有一个列,其中包含此格式的人员详细信息: 实际csv格式: 我想将它们拆分为一个新的csv文件,如下所示: 拆分详细信息: 拆分行分隔符: