【问题标题】:Obtain unique/unrepeated values from a List从列表中获取唯一/不重复的值
【发布时间】:2013-06-12 12:27:21
【问题描述】:

我有一个可能包含重复值的 ArrayList tmp_list。我的目标是用每个值只出现一次来填充另一个 ArrayList filtered_tmp_list。这就是我所做的:

ArrayList<String> filtered_tmp_list = new ArrayList<String>();

filtered_tmp_list.add((String) tmp_list.get(0));

for(int i=0; i<tmp_list.size(); i++){
    String cmp = (String) tmp_list.get(i) ;
    int doubled = 0;
    for(int j=0; j<filtered_tmp_list.size(); j++){
        String cmpd = (String) tmp_list.get(j) ;
        if(cmp.compareTo(cmpd)==0){
            doubled ++ ;
        }
    }
    if(doubled==0) filtered_tmp_list.add(cmp);
}

我的想法是检查 filtered_tmp_list 中已经存在的值是否存在于 tmp_list 中不止一次,如果是,我什么也不做,否则:如果 doubled 等于 0,则意味着值应该插入filtered_tmp_list

好吧,正如您所料,我在这里是因为我得到了重复的值... 我错过了什么?

谢谢。

【问题讨论】:

  • compareTo 用于排序,不用于比较相等性
  • 我知道,但这不是目前问题的核心,不是吗?
  • tmp_list 中有什么内容?
  • tmp_list是另一个List的填充副本,简而言之,它是一个重复值的填充List。
  • Set 会是更好的解决方案。

标签: java algorithm arraylist


【解决方案1】:

使用Set,然后使用List

List<String> ret = new ArrayList<>(new HashSet<>(origList));

Set 不能包含重复元素;并且使用了HashSet,因为String 实现了.equals().hashCode()

如果您想保持初始列表中元素的原始顺序,请将HashSet 替换为LinkedHashSet

(如果不是 Java 7,则用 String 填充空白菱形)

编辑:查看@zerocool 对原始代码有什么问题的回答

【讨论】:

  • 请注意,这不会保留 List 的原始顺序。如果排序无关紧要,那么它肯定是一个简单而有效的解决方案。
  • @Glosrio 没问题!当我开始理解 Sets 的目的时,我花了一些时间,但是一旦你阅读了 javadoc,再阅读一遍,你就会明白它们背后的意义
  • @johnchen902 :知道这会很有趣。不过有一件事:它肯定会大大减少值的数量(就像这样很好......)。
  • @johnchen902 这是一个谜,因为 String 的 .compareTo() 与 .equals() AFAIK 一致
  • @johnchen902 :查看下面@zerocool 的答案,逻辑没有错,只是一个愚蠢的错误......但一切都很好,让我发现了Set 的良好用途。
【解决方案2】:

如果您担心插入顺序

List<String> ret = new ArrayList<String>(new LinkedHashSet<String>(origList));

【讨论】:

  • 呃,equals 返回一个布尔值!
  • 是的,必须是!cmp.equals(cmpd)
【解决方案3】:

给你:

Replace below code it works:

for(int j=0; j<filtered_tmp_list.size(); j++){
        **String cmpd = (String) filtered_tmp_list.get(j) ;**
        if(cmp.compareTo(cmpd)==0){
            doubled ++ ;
        }
    }

【讨论】:

  • 你的逻辑没问题,我希望你能从上面的代码中找出你犯错的地方。
  • 抱歉迟到了,是的,我注意到了,我想我需要哭了,我 90% 的编程困难来自拼写错误或愚蠢。好吧,+1 @zerocool 的眼睛很好,谢谢!
  • 我相信做错别字是件好事,只要你能调试它们:)。下次当你认为你的逻辑是正确的但代码在某处出现问题时,请喝杯咖啡:)
猜你喜欢
  • 2012-10-05
  • 1970-01-01
  • 2010-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-06
  • 1970-01-01
相关资源
最近更新 更多