Java 将多个列表中的元素分组

Java 将多个列表中的元素分组,java,list,groovy,Java,List,Groovy,我有以下数据结构: 基本上这里我有一个列表,其中包含其他列表(它们的大小可以是任意的,在我的例子中,所有4个列表的大小都是2)。我必须分组,使具有相同元素的列表进入一个列表(可能不是最好的公式,但我无法更好地公式化)。就我而言,结果应如下所示: [72,83,127]和[110,119] 例如,如果第三个子列表包含元素[83、127、55、22],则结果应如下:[72、83、127、55、22]和[110、119]。(因此我必须包含所有子列表元素) 在Java或Groovy中如何做这样的事情?

我有以下数据结构:

基本上这里我有一个列表,其中包含其他列表(它们的大小可以是任意的,在我的例子中,所有4个列表的大小都是2)。我必须分组,使具有相同元素的列表进入一个列表(可能不是最好的公式,但我无法更好地公式化)。就我而言,结果应如下所示:
[72,83,127]
[110,119]

例如,如果第三个子列表包含元素
[83、127、55、22]
,则结果应如下:
[72、83、127、55、22]
[110、119]
。(因此我必须包含所有子列表元素)


在Java或Groovy中如何做这样的事情?

因为您必须处理整个列表,一个好的选择是利用Groovy集合的方法(添加
println
以显示步骤):

编辑:上述解决方案在某些情况下不起作用,即:

def values = [[72, 83], [72, 127], [83, 127], [110, 119], [47, 56], [56, 72]]
屈服

[[72, 83, 127, 56], [110, 119], [47, 56]]
如果对列表进行排序,则会产生(我认为这是正确的解决方案)

编辑(2):解决前一个问题的更好解决方案(即,一个列表与多个结果列表共享元素):

def值=[[72,83]、[72,127]、[83,127]、[110,119]、[120,121]、[121,127]]
def result=values.injection([],{res,value->
println“res=$res | value=$value”
def found=res.findAll{it.intersect(value)}
println“->found=$found”
如果(!找到){

res这里是使用映射的java实现。首先,我们将ArrayList转换为映射,即key=integerInList+value=NoOfOccurrence。然后,我们只需搜索映射中的每个元素,如果该元素出现次数超过1次,则只需添加到相应的组(Set)

publicstaticvoidfind(){
//输入数据
ArrayList list1=新的ArrayList();
列表1.add(Arrays.asList(72,83));
list1.add(Arrays.asList(72127));
list1.add(Arrays.asList(83127));
list1.add(Arrays.asList(110119));
Map Map=newhashmap();
//将输入数据转换为地图
for(列出整数:list1){
for(整数:整数){
整数1=1;
if(map.containsKey(整数)){
integer1+=map.get(整数);
}
map.put(整数,整数1);
}
}
Set group1=新的HashSet();
Set group2=新的HashSet();
//查找和构建组
for(列出整数:list1){
布尔值=false;
for(整数:整数){
if(map.containsKey(整数)){
if(map.get(整数)>1){
发现=真;
打破
}
}
}
如果(找到){
组1.addAll(整数);
}否则{
组2.addAll(整数);
}
}
System.out.println(“group1=“+group1”);
System.out.println(“group2=“+group2”);
}

我完全搞不清楚您想如何决定输入中的元素应该进入哪个输出列表。子列表0包含72和83。子列表1包含72和127。由于两者都包含72,我们将它们合并。子列表2包含83和127。由于子列表1也包含83(或第二个contais 128)我们还合并了子列表1和3。那么……你是说如果列表之间的交集为非空,那么你想合并列表吗?是的,没错。对不起,英语不是我的母语。你有什么值,例如72、83等,你是将它们存储为整数或字符串吗?你说的“如果列表被排序”是什么意思?[[47、56]、[56、72],[72,83]、[72,127]、[83,127]、[110,119]]好的,我只使用.sort()方法。
def values = [[72, 83], [72, 127], [83, 127], [110, 119], [47, 56], [56, 72]]
[[72, 83, 127, 56], [110, 119], [47, 56]]
[[47, 56, 72, 83, 127], [110, 119]]
def values = [[72, 83], [72, 127], [83, 127], [110, 119], [120, 121], [121, 127]]

def result = values.inject([], { res, value -> 
    println "res = $res | value = $value"
    def found = res.findAll { it.intersect(value) }
    println "  -> found = $found"

    if (!found) {
        res << value
    } else {
        res.removeAll(found)
        def merged = found.collect({ it + value as Set }).flatten() as Set
        println "  -> merged = $merged"
        res << merged
    }

    println "  => res = $res"
    res
})
public static void find() {
    //Input Data
    ArrayList<List<Integer>> list1 = new ArrayList<>();
    list1.add(Arrays.<Integer>asList(72, 83));
    list1.add(Arrays.<Integer>asList(72, 127));
    list1.add(Arrays.<Integer>asList(83, 127));
    list1.add(Arrays.<Integer>asList(110, 119));

    Map<Integer, Integer> map = new HashMap<>();

    //Convert Input Data to Map
    for (List<Integer> integers : list1) {
        for (Integer integer : integers) {
            int integer1=1;
            if (map.containsKey(integer)) {
                integer1 += map.get(integer);
            }
            map.put(integer, integer1);
        }
    }

    Set<Integer> group1 = new HashSet<>();
    Set<Integer> group2 = new HashSet<>();
    //find and build groups
    for (List<Integer> integers : list1) {
        boolean found = false;
        for (Integer integer : integers) {
            if (map.containsKey(integer)) {
                if (map.get(integer) > 1) {
                    found = true;
                    break;
                }
            }
        }
        if (found) {
            group1.addAll(integers);
        } else {
            group2.addAll(integers);
        }
    }

    System.out.println("group1 = " + group1);
    System.out.println("group2 = " + group2);
}