【问题标题】:Finding duplicates in a list/file. [Groovy/Java]在列表/文件中查找重复项。 [Groovy/Java]
【发布时间】:2019-01-14 05:19:51
【问题描述】:

我有一个输入文件,其中每一行都是一个特殊记录。 我很乐意在文件级别工作,但可能是将文件传输到列表中的更方便的方法。 (列表中的每个对象 = 文件中的每一行) 在输入文件中,可以有多个重复行。 目标: 将给定文件/列表拆分为唯一记录和重复记录,即多次出现的记录,保留一次,其他重复部分存储在新列表中 我找到了一种删除重复项的简单方法,但从未找到存储它们的方法

File inputFile = new File("....")
inputFile.eachLine {    inputList.add(it)   } //fill the list
List inputList = [1,1,3,3,1,2,2,3,4,1,5,6,7,7,8,9,8,10]
inputList = inputList.unique() // remove duplicates
println inputList
// inputList = [1, 3, 2, 4, 5, 6, 7, 8, 9, 10]

输出应如下所示:两个列表/文件已删除重复项和重复项本身

inputList = [1,3,2,4,5,6,7,8,9,10] //only one ocurance of each line
listOfDuplicates = [1,1,1,3,3,2,7,8] //duplicates removed from original list

输出不需要与项目的初始顺序相对应。 谢谢你的帮助,马特

【问题讨论】:

    标签: list groovy collections duplicates unique


    【解决方案1】:

    这段代码应该可以解决问题

     List listOfDuplicates = inputList.clone()
     listOfDuplicates.removeAll{
        listOfDuplicates.count(it) == 1
     }
    

    【讨论】:

      【解决方案2】:

      有很多方法可以做到这一点,以下是最简单的方法

      def list = [1,1,3,3,1,2,2,3,4,1,5,6,7,7,8,9,8,10]
              def unique=[]
              def duplicates=[]
              list.each {
                  if(unique.contains(it))
                      duplicates.add(it)
                  else
                      unique.add(it)
      
              }
              println list //[1, 1, 3, 3, 1, 2, 2, 3, 4, 1, 5, 6, 7, 7, 8, 9, 8, 10]
              println unique //[1, 3, 2, 4, 5, 6, 7, 8, 9, 10]
              println duplicates //[1, 3, 1, 2, 3, 1, 7, 8]
      

      希望对你有帮助

      【讨论】:

        【解决方案3】:

        越多越好:

        groovy:000> list.groupBy().values()*.tail().flatten()
        ===> [1, 1, 1, 3, 3, 2, 7, 8]
        
        1. 按身份分组(这基本上是一个“频率”函数)。
        2. 只取值
        3. 剪辑第一个元素
        4. 合并列表

        【讨论】:

          【解决方案4】:

          如果重复的顺序不重要:

          def list = [1,1,3,3,1,2,2,3,4,1,5,6,7,7,8,9,8,10]
          def (unique, dups) = list.groupBy().values()*.with{ [it[0..0], tail()] }.transpose()*.sum()
          assert unique == [1,3,2,4,5,6,7,8,9,10]
          assert dups == [1,1,1,3,3,2,7,8]
          

          【讨论】:

          • 感谢您提供了一种有趣的方法,有点难以理解代码中发生了什么,但毕竟我明白了:) 对于我的需要,这太复杂了,性能也太差了在高记录时明显更差
          【解决方案5】:

          您可以简单地自己遍历列表:

          def inputList = [1,1,3,3,1,2,2,3,4,1,5,6,7,7,8,9,8,10]
          
          def uniques = []
          def duplicates = []
          
          inputList.each { uniques.contains(it) ? duplicates << it : uniques << it }
          
          assert inputList.size() == uniques.size() + duplicates.size()
          assert uniques == [1,3,2,4,5,6,7,8,9,10] //only one ocurance of each line
          assert duplicates == [1,3,1,2,3,1,7,8] //duplicates removed from original list
          
          inputList = uniques // if desired
          

          【讨论】:

          • 这是一个聪明的方法,我很惭愧我自己没有弄清楚。谢谢迈克
          【解决方案6】:

          一些非常直接的东西:

          List inputList = [1,1,3,3,1,2,2,3,4,1,5,6,7,7,8,9,8,10] 
          def uniques = [], duplicates = []
          
          Iterator iter = inputList.iterator()
          iter.each{
            iter.remove()
            inputList.contains( it ) ? ( duplicates << it ) : ( uniques << it )
          }
          
          assert [2, 3, 4, 1, 5, 6, 7, 9, 8, 10] == uniques
          assert [1,1,3,3,1,2,7,8] == duplicates
          

          【讨论】:

          • 我确信这很简单,但我无法做到。非常感谢:)
          猜你喜欢
          • 2013-02-21
          • 2013-11-17
          • 1970-01-01
          • 2019-01-15
          • 2021-04-08
          • 2022-01-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多