首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与列表上的情侣一起工作,忽略顺序...一种优雅的方式?

与列表上的情侣一起工作,忽略顺序...一种优雅的方式?
EN

Stack Overflow用户
提问于 2013-05-08 09:17:11
回答 2查看 812关注 0票数 0

我有一个元素列表(在java中),假设:

代码语言:javascript
复制
List<Integer> elem = new ArrayList<>();
elem.add(1);
elem.add(2);
elem.add(3);
elem.add(4);

我只想遍历每一对独特的组合一次(这意味着我想要这6对:1,2; 1,3; 1,4; 2,3; 2,4; 3,4)

我这样做是这样的:

代码语言:javascript
复制
int i = 1;
for(Integer a:elem) {
  for(int j = i; j<elem.size(); j++) {
    Integer b = elem.get(j);
    doSomethingWithCouple(a,b);
  }
  i++;
}

“问题”是,我不太喜欢它。你知道更优雅/更简单的解决方案吗?谢谢

EN

回答 2

Stack Overflow用户

发布于 2013-05-08 09:19:10

只是把外部循环写成一个‘传统的’for for (i = 0; i < elems.size(); i++)循环。

代码语言:javascript
复制
for (i = 0; i < elems.size(); i++) {
   for (j = i+1; j < elems.size(); j++) {
       int ei = elems.get( i);
       int ej = elems.get( j);
       doSomethingWith( ei, ej);
   }
}

这是非常清晰的 --当然,获取ei可能会被挂起到外部循环,但代价是代码会变得不那么清晰。

票数 4
EN

Stack Overflow用户

发布于 2013-05-08 09:26:09

I found a library that will do this for you

代码语言:javascript
复制
package com.sandbox;

import org.paukov.combinatorics.Factory;
import org.paukov.combinatorics.Generator;
import org.paukov.combinatorics.ICombinatoricsVector;

public class Sandbox {

    public static void main(String[] args) {
        // Create the initial vector
        ICombinatoricsVector<Integer> initialVector = Factory.createVector(
                new Integer[]{1, 2, 3, 4});

        // Create a simple combination generator to generate 3-combinations of the initial vector
        Generator<Integer> gen = Factory.createSimpleCombinationGenerator(initialVector, 2);

        // Print all possible combinations
        for (ICombinatoricsVector<Integer> combination : gen) {
            System.out.println(combination.getValue(0) + " " + combination.getValue(1));
        }
    }       
}

输出:

代码语言:javascript
复制
1 2
1 3
1 4
2 3
2 4
3 4
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16431126

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档