0

我有一个List<String>类似的元素:

"<prefix-1>/A",
"<prefix-1>/B",
"<prefix-2>/A",
"<prefix-2>/B",
"<prefix-3>/A",
"<prefix-3>/B",

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

我想要前缀列表:

"<prefix-1>",
"<prefix-2>",
"<prefix-3>",

当多个(但总是数量不变的元素)对应于转换列表中的一个元素时,转换源列表的好方法是什么?

谢谢您的考虑

4

4 回答 4

3

如果前缀始终是恒定长度,您可以将它们修剪掉并放入一个 Set 中:

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.

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

于 2013-05-06T15:09:20.020 回答
1

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

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

这是关于 ideone 的演示

于 2013-05-06T15:08:27.577 回答
0

如果结构相似的元素的编号始终相同,那么您只需遍历列表的开头即可找出该编号,然后跳过元素以构造其余部分。

于 2013-05-06T15:09:37.530 回答
0
public List<String> getMyList(prefix){
List<String> selected= new ArrayList<String>();

for(String s:mainList){
    if(s.endsWith(prefix.toLower())) // or .contains(), depending on 
        selected.add(s);     // what you want exactly 
}

return selected;

}
于 2013-05-06T15:20:03.773 回答