在Groovy中查找列表中重复项的有效方法

6ovsh4lw  于 2022-11-01  发布在  其他
关注(0)|答案(3)|浏览(234)

我用以下方式构建了GroovyMap:

list1 = [ "val1" "val2" "val3" ]
list2 = [ "val7" "val8" ]
list3 = [ "val4" "val5" "val2" ]
list4 = [ "val6" "val4" "val3" ]
map["key1"] = list1
map["key2"] = list2
map["key3"] = list3
map["key4"] = list4

我需要遍历map,并将每个列表与map中的其他列表进行比较,如果列表中的任何项与其他列表中的任何项匹配,则会抛出一个错误,例如,在上面的情况下,由于list1的值(val2)与list3匹配,因此它应该抛出一个错误,并停止在map中进一步处理。
我可以对2个列表进行交叉来找到重复项,但为此我可能需要对Map进行两次迭代,例如,对于每个键,获取值,然后再次迭代Map来获取其他键的列表,并从第一个列表开始逐个交叉来找到重复项或类似的东西,但这不是实现这一点的有效方式。
在groovy中是否可以更有效地实现这一点?

yyyllmsg

yyyllmsg1#

使用disjoint执行类似下面的操作怎么样

def list1 = [ "val1", "val2" ,"val3" ]
def list2 = [ "val7", "val8" ]
def list3 = [ "val4", "val5", "val24" ]
def list4 = [ "val6", "val4", "val3" ]

def map = [:]

map["key1"] = list1
map["key2"] = list2
map["key3"] = list3
map["key4"] = list4

def merged = []

map.each { key, val ->
    println "KEY: $key VAL: $val"
    if(!merged.disjoint(val)) {
         throw new Exception("Duplicates!!!")
    }
    merged.addAll(val) 
}

这里disjoint的时间复杂度是O(n)。另外,值得注意的是,在两个列表ab之间,如果a.size()b.size(),时间复杂度将是O(a)。

6g8kf2rb

6g8kf2rb2#

时间复杂度a(a),是一个复杂度为O(n)的过程。
时间复杂度为O(n.log(n))。
时间复杂度为O(n),所以每次迭代的时间复杂度为O(n)。
时间复杂度为O(n·log(n))。
如果n很小,有一个更聪明的方法来实现,特别是当列表中的一个很小的时候。在这种情况下,“暴力”算法的平均失败时间是O(n^2),但是,在任何情况下,如果n很小,优化都是不值得的:编写维护人员最容易理解的程序。

ulydmbyx

ulydmbyx3#

我会把它们放到一个List中。你只需要在String列表中循环一次。当你把这些项放到List中时,首先检查一下这些项是否在列表中。

import java.util.ArrayList;
import java.util.List;

public class Main {

    List<String> mergedList = new ArrayList<>();
    public String stringList1[] = { "12q3", "21351", "1312", "12331", "34554", "cfA23" };
    public String stringList2[] = { "12ASD3", "21351", "13\32", "12F331", "345D4", "cfF23" };

    public static void main(String args[]) {
        Main main = new Main();
        main.start();
    }

public void start() {
    List<String[]> listOfLists = new ArrayList<>();
    listOfLists.add(stringList1);
    listOfLists.add(stringList2);

    for (String[] strings : listOfLists) {
        checkForDuplicates(strings);
    }

}

public void checkForDuplicates(String[] listOfStrings) {
    for (String currentString : listOfStrings) {
        if (mergedList.contains(currentString)) {
            System.out.println("Duplicated Item:currentString");
            continue;
        }
        System.out.println("Added:" + currentString);
        mergedList.add(currentString);
    }

}
}

相关问题