首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将源列表中的每组两个元素转换为转换后的列表?

如何将源列表中的每组两个元素转换为转换后的列表?
EN

Stack Overflow用户
提问于 2013-05-06 23:04:14
回答 4查看 76关注 0票数 0

我有一个包含如下元素的List<String>

代码语言:javascript
复制
"<prefix-1>/A",
"<prefix-1>/B",
"<prefix-2>/A",
"<prefix-2>/B",
"<prefix-3>/A",
"<prefix-3>/B",

也就是说,对于每个<prefix>,都有两个条目:<prefix>/A<prefix>/B。(我的列表已经排序,前缀可能有不同的长度。)

我想要前缀的列表:

代码语言:javascript
复制
"<prefix-1>",
"<prefix-2>",
"<prefix-3>",

当多个(但始终是恒定数量的元素)对应于转换后的列表中的一个元素时,转换源列表的好方法是什么?

谢谢你的考虑

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-05-06 23:09:20

如果前缀的长度始终不变,则可以将它们修剪掉并放入一个集合中:

代码语言:javascript
复制
List<String> elements = // initialize here
Set<String> prefixes = new HashSet<String>();
for( String element : elements) {
    String prefix = element.substring(0,"<prefix-n>".length());
    prefixes.add(prefix);
}
// Prefixes now has a unique set of prefixes.

如果你有一个可变长度的前缀,或者你有更复杂的条件,你也可以对正则表达式做同样的事情。

票数 3
EN

Stack Overflow用户

发布于 2013-05-06 23:08:28

这是一个不改变结果中前缀顺序的解决方案。由于元素是预先排序的,因此您可以获取元素,直到找到与上次获取的元素不同的前缀,然后将新元素添加到结果中,如下所示:

代码语言:javascript
复制
List<String> res = new ArrayList<String>();
String last = null;
for (String s : src) {
    String cand = s.substring(0, s.lastIndexOf('/'));
    // initially, last is null, so the first item will always be taken
    if (!cand.equals(last)) {
        // The assignment of last happens together with addition.
        // If you think it's not overly readable, you can move it out.
        res.add(last = cand);
    }
}

这是一个demo on ideone

票数 1
EN

Stack Overflow用户

发布于 2013-05-06 23:09:38

如果结构上相似的元素的数量总是相同的,那么你可以在列表的开头循环来找出这个数字,然后跳过元素来构造其余的元素。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16401598

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档