java - 检查完全包含在其他字符串列表中的字符串列表

标签 java string list linked-list

我编写这段代码是为了检查字符串列表是否完全包含在另一个字符串列表中,在这种情况下删除该列表。

public static void main(String[] args) {
    LinkedList<String> l1 = new LinkedList<String>();
    LinkedList<String> l2 = new LinkedList<String>();
    l1.add("Cc");
    l1.add("Dd");
    l2.add("Cc");
    l2.add("Dd");
    l2.add("Ee");
    LinkedList<LinkedList<String>> l = new LinkedList<LinkedList<String>>();
    l.add(l1);
    l.add(l2);
    System.out.println("OUTPUT: " + filterSublist(l));

}

static List<LinkedList<String>> filterSublist(LinkedList<LinkedList<String>> l) {
    List<LinkedList<String>> uniq = new LinkedList<LinkedList<String>>(l);
    l.forEach(elem -> uniq.removeIf(x -> !x.equals(elem) && elem.contains(x)));
    return uniq;
}

函数filterSubList应该返回一个字符串列表列表,其中没有完全包含在其他列表中的列表。 在示例中,我们有:

  • 列表 1:“抄送、抄送”
  • 列表 2:“抄送、Dd、Ee”

由于列表 1 完全包含在列表 2 中,因此该函数应返回仅包含列表 2 的列表列表。 但是当我运行该程序时,我得到的输出是一个包含两者的列表:

OUTPUT: [[Cc, Dd], [Cc, Dd, Ee]]

这是错误的。 filterSubList函数有错误吗?

最佳答案

您正在检查一个列表(对象)是否包含另一个列表(对象)。每当创建新对象时,都会在内存中分配不同的新列表,而是使用 containsAll 检查内部对象:

试试这个:

static List<LinkedList<String>> filterSublist(LinkedList<LinkedList<String>> l) {
List<LinkedList<String>> uniq = new LinkedList<LinkedList<String>>(l);
l.forEach(elem -> uniq.removeIf(x -> !x.equals(elem) && elem.containsAll(x)));
return uniq;
}

如果 Rene 提出了一些与 OP 相关的观点,这里的实现基本上遵循他的指导,但方式不同。

static List<LinkedList<String>> filterSublistAlternate(LinkedList<LinkedList<String>> l) {
boolean[] removed = new boolean[ l.size() ]; 
outer: for(int i=0; i< l.size() ; i++)
    inner: for(int j=0; j< l.size() ; j++)
    {
        if( i != j )
        if(l.get(j).containsAll(l.get(i)))
        {
            System.out.println(i+" and "+j);
            if(l.get(i).size() == l.get(j).size())
                if(removed[i] == removed[j] && !removed[i])
                    removed[i] = true;
                else
                    continue outer;
            else
            {
                removed[i] = true;
                continue outer;
            }

        }
    }

for(int i=removed.length-1; i>=0  ; i--)
    if(removed[i])
        l.remove(i);

return l;
}

关于java - 检查完全包含在其他字符串列表中的字符串列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41923463/

相关文章:

java - 编译时多态性

java - 在java中迭代EnumMap有什么更好的方法?

java - 调用方法之前的 Java 泛型表示法是什么?

java - 在字符串中查找换行符 "\n"

PHP 扩展 - RETURN_STRING

c - 如何将未知大小的字符串数组传递给 C 中的函数

python - 使用 for 循环生成列表

java - Spring MVC 3 AJAX

r - 嵌套列表的条件子集

python - 如何避免在 python 程序的输出中打印 None 列表