有效地删除LinkedList中其他字符串中包含的字符串

时间:2017-01-21 14:05:46

标签: java string linked-list

我有一个包含字符串的简单LinkedList。

LinkedList<String> list = new LinkedList<String>();
list.add("A, B, C, D");
list.add("R");
list.add("A");
list.add("C, D");

因此,我们的LinkedList是:[ "A, B, C, D", "R", "A" ,"C, D" ]

如您所见,"A""C, D"已包含在"A,B,C,D"中。

删除包含字符串的最有效方法是什么?

4 个答案:

答案 0 :(得分:1)

首先,你可以在添加新值之前使用contains()方法(只要你每次都添加单个String,但你不是......)。

其次,如果您要更改添加字符串或LinkedList限制的方式,似乎可以轻松避免此“问题”。

无论如何,这是一个可以满足您需求的简单方法:

private  void deleteIfContains(LinkedList<String> list, String str) {
    Iterator<String> headIterator = list.iterator();
    HashMap<Integer, String> newValues = new HashMap<>();
    int index = 0;

    while (headIterator.hasNext()) {
        String headString = headIterator.next();

        if (headString.contains(str)) {
            headIterator.remove();
            //replace method won't handle ','..you will need to use regex for it
            newValues.put(index, headString.replace(str, ""));
        }
        index++;
    }

    //Avoid ConcurrentModificationException
    for (int i : newValues.keySet()) {
        list.add(i, newValues.get(i));
    }
}

答案 1 :(得分:0)

我建议您使用Set,但是您必须在单个String变量中包含每个字母(也许您应该使用Character?)。

如果您真的想坚持自己的想法,请考虑实施自己的Set。但首先弄清楚在那种情况下会发生什么:

LinkedList<String> list = new LinkedList<String>();
list.add("A, B, C, D");
list.add("C, E");

C应该被拒绝,但是E呢?

答案 2 :(得分:0)

正如@nikowis所说,最佳解决方案取决于问题的定义。

如果值是元素&#34; A&#34;,&#34; B&#34;,&#34; C&#34;,&#34; D&#34;,...更多有效的解决方案(在计算时间上)可以将列表转换为List&gt;或一套。

如果值为&#34; substring&#34;,例如&#34; C,E&#34;是一个值(而不是两个&#34; C&#34;和#34; E&#34;)你可以使用子串&#34; Trie&#34; (https://en.wikipedia.org/wiki/Trie)。它可以很快找到trie中子串的存在(O(log N),其中N是要添加的字符串的长度)。

答案 3 :(得分:0)

将csv-format字符串转换为字符串值。然后将它们存储为set元素。如果方法pytest#返回true,则表示值已存在。

add()