我有一个字符串的Arraylist。我想删除该数组中另一个字符串的子串的字符串。我有一个python实现但是java很棘手。 Python
def filterSublist(lst):
uniq = lst
for elem in lst:
uniq = [x for x in uniq if (x == elem) or (x not in elem)]
return uniq
对于java,我需要检查元素是否包含在另一个元素中,如果是,则不执行任何操作,如果不将其添加到另一个元素中。
for(String element : list){
for(int j = 0; j < list.size(); j++)
if (! element.contains(list.get(j))){
listUniq.add(date);}
}
java解决方案无法正常工作。一个原因是它还将元素与元素本身进行比较。任何帮助表示赞赏。
答案 0 :(得分:4)
使用Java 8,您可以直接使用lambdas和流API:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Sample {
public List<String> filterSublist(List<String> lst) {
List<String> uniq = new ArrayList<String>(lst);
lst.forEach(elem -> uniq.removeIf(x -> !x.equals(elem) && elem.contains(x)));
return uniq;
}
public static void main(String[] args) {
Sample sample = new Sample();
List<String> filtered = sample.filterSublist(
Arrays.asList("hello", "there", "the",
"low", "hell", "lower", "here"));
System.out.println(filtered); // [hello, there, lower]
}
}
我刚刚在removeIf()
方法中否定了谓词,因为我删除了元素而不是添加它们。
答案 1 :(得分:2)
您可以尝试将每个字符串与其他字符串进行比较(除了自身):
List<String> toRemove = new ArrayList<>();
for(int i = 0; i < list.size(); i++)
{
String element0 = list.get(i);
for(int j = 0; j < list.size(); j++)
{
String element1 = list.get(j);
if(!element0.equals(element1) && element0.contains(element1) && !toRemove.contains(element1)) toRemove.add(element1);
}
}
list.removeAll(toRemove);
答案 2 :(得分:2)
这是我建议的解决方案。
public Set<String> getUnique(List<String> source) {
HashSet<String> result = new HashSet<String>();
boolean contains = false;
for (String s : source) {
for (String unique : result) {
if (unique.contains(s)) {
contains = true;
break;
} else if (s.contains(unique)) {
result.remove(unique);
result.add(s);
contains = true;
break;
}
}
if (!contains) {
result.add(s);
}
}
return result;
}
在这个解决方案中,我们不会每次迭代整个集合,而只是检查元素是否包含在结果集中。如果有很多匹配,我们可以节省大量的迭代。