【问题标题】:How to check that List<String> doesn't contain duplicates ignore case如何检查 List<String> 不包含重复项忽略大小写
【发布时间】:2018-02-22 06:01:53
【问题描述】:

我想检查List&lt;String&gt; 是否包含重复项忽略大小写

我知道我可以像这样写结构

for(...){
   for(...){} 
}

但我想找到更好的方法

【问题讨论】:

标签: java string list collections duplicates


【解决方案1】:

您可以创建一个List,其中只有String 大写。
然后将这些元素收集到删除所有重复项的Set 中。
最后,将Set 的大小与List 的大小进行比较:如果大小不同,则表示您至少有一个重复项。

可执行代码:

import java.util.Arrays;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

public class RemoveDuplicateInsensitiveCaseString {

    public static void main(String[] args) {
      List<String> list =  Arrays.asList("abort", "Abort", "accent", "ACCENT");
      Set<String> set = list.stream().map(String::toUpperCase).collect(Collectors.toSet());     
      if (set.size() != list.size()){
        // you have duplicate
        System.out.println(set);
      }
    }
}

输出:

[重音,中止]

【讨论】:

  • 太棒了!谢谢你的回答
  • 您还可以实现一个独特的流,就像在这个 q/a stackoverflow.com/questions/23699371/…987654321@中解释的那样。
  • 为什么不使用Collectors.toSet()直接收集到一个集合?
  • @Henrik 没有好的理由:经常使用Collectors.toList() 的习惯。我忘了。非常感谢。我更新了。
  • @gstackoverflow 欢迎您。我更新了一个更直接的实现。感谢 Henrik 的发言。
【解决方案2】:

使用不区分大小写的比较器将输入列表添加到TreeSet,然后检查大小:

List<String> input = Arrays.asList("a", "A", "b");

Set<String> set = new TreeSet<>(String.CASE_INSENSITIVE_ORDER);
set.addAll(input);

boolean containsDuplicates = input.size() != set.size();

更新:Run it here

【讨论】:

  • 短小精悍,我们使用Roee Gavirel answer作为大列表,如果我们发现一个重复,则无需检查完整列表。
  • @Henrik 比较器检测顺序并且不影响等号。因此可比较哪个返回 0 将在集合中
  • @gstackoverflow :不,它也用于集合中的相等性检查。运行代码进行验证。
  • @gstackoverflow:链接添加到程序的可运行版本。玩弄它。
【解决方案3】:
List<String> origList;
Set<String> exists = new HashSet();

boolean dup = false;
for (String s : origList) {
    if (!exists.add(s.toLower()) {
        dup = true;
        break;
    }
}

// dup param will have your answer        

【讨论】:

  • 只是说,但使用Set.add 就足够了,如果它不存在,它会返回true。所以if( ! exists.add(s.toLower()) return true;
  • 我喜欢这个解决方案,它会在第一次复制时停止,更有效!
猜你喜欢
  • 2020-07-25
  • 2012-12-10
  • 2013-05-12
  • 1970-01-01
  • 2015-07-18
  • 2015-04-25
  • 2014-10-14
  • 2014-12-23
  • 2011-01-17
相关资源
最近更新 更多