我有一个包含字符串的简单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"
中。
删除包含字符串的最有效方法是什么?
答案 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()