删除数组中的元素,这些元素是Java中其他元素的子字符串

时间:2015-03-13 22:44:11

标签: java string arraylist substring

我有一个字符串的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解决方案无法正常工作。一个原因是它还将元素与元素本身进行比较。任何帮助表示赞赏。

3 个答案:

答案 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;

        }

在这个解决方案中,我们不会每次迭代整个集合,而只是检查元素是否包含在结果集中。如果有很多匹配,我们可以节省大量的迭代。