2017-01-21 70 views
2

我有一个简单的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

为什么不使用'Set'? – CKing

+1

Set不起作用,对于那种逻辑,你应该编写你自己的实现。 – nikowis

+2

您的数据结构对于此目的不切实际。考虑将值存储为Set而不是CSV字符串。 – Bohemian

回答

1

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

其次,好像这个“问题”,可以很容易避免的,如果你改变你要添加的字符串的方式,或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)); 
    } 
} 
0

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

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

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

C应予以拒绝,但怎么样E

+0

您评论说'Set'不会工作,并继续回答使用'Set'的问题;) – CKing

+0

任何现有的集合实现都不起作用,正如我在评论中所说的,自定义实现可以处理该逻辑。 – nikowis

+0

你说过,*我建议你使用Set而不是*然后你说*如果你真的想坚持自己的想法*。你基本上是说使用“设置”的权利? – CKing

0

由于@nikowis说最好的解决方案取决于问题的定义。

如果这些值是元素“A”,“B”,“C”,“D”......更高效的解决方案(计算时间)可以将列表转换为列表>或单套。如果值是“substring”,例如“C,E”是一个值(而不是两个“C”和“E”),则可以使用子字符串“Trie”(https://en.wikipedia.org/wiki/Trie)。它可以很快找到trie中子字符串的存在(O(log N),N是要添加的字符串的长度)。

0

将csv格式字符串转换为字符串值。然后将它们存储为集合元素。如果方法add()返回true,则表示该值已经存在。

String[] values = csvStr1.split(","); 
Set<String> hashSet = new HashSet<String>(Arrays.asList(values)); 

String[] values2 = csvStr2.split(","); 
for (String value: values2) { 
    if(hashSet.add(value) == true) { 
      //value already present. Ignore this or do whatever you want. 
    } 
} 
相关问题