【问题标题】:How to loop through a combination only once?如何只循环一次组合?
【发布时间】:2012-07-10 14:40:59
【问题描述】:

我正在尝试遍历一个数组,但是我遇到了这个问题。 当我遍历这个数组时:

{1,2,3,4}

我遇到了这个问题:在开始时,我会得到 1 和 4 的组合,但是在中间附近我会得到 4 和 1 的组合。我怎样才能让它只接受唯一的关系?不可能有像 {1,4} 和 {4,1} 这样的东西。

我正在使用 Java,对此已有一些答案,但是他们使用的库仅以其他语言提供。

不幸的是,我什至无法想出一个解决方案。

这是遍历数组后的预期输出:

{1, 2}
{1, 3}
{1, 4}
{2, 3}
{2, 4}
{3, 4}

但这是循环遍历数组时实际发生的情况:

{1, 1}
{1, 2}
{1, 3}
{1, 4}
{2, 1}
{2, 2}
{2, 3}
{2, 4}
{3, 1}
{3, 2}
{3, 3}
{3, 4}
{4, 1}
{4, 2}
{4, 3}
{4, 4}

所以这两个要求是一对必须是唯一的关系(不能有 1,2 和 2,1)并且它们也不能相同。通过比较两个数字并查看它们是否相等可以很容易地做到不一样,但我在第一个要求方面遇到了麻烦。

【问题讨论】:

  • 看起来像 2 个数组。你在寻找什么结果?您想要整数数组中的每一对整数中的一个吗?
  • @GustavKarlsson 我添加了预期输出和当前输出
  • @Pshemo 我添加了预期和当前输出以尝试提供帮助。代码只是一个简单的循环数组。

标签: java arrays loops for-loop


【解决方案1】:

在您更新后,我假设您正在寻找类似的东西

int[] arr={1,2,3,4};
for (int i=0; i<arr.length; i++)
    for (int j=i+1; j<arr.length; j++)
        System.out.println("{"+arr[i]+","+arr[j]+"}");

输出:

{1,2}
{1,3}
{1,4}
{2,3}
{2,4}
{3,4}

【讨论】:

    【解决方案2】:

    如果您想从第一组和第二组中找出所有可能的无序对,那么只需执行以下操作:

    List<Pair> pairs = new ArrayList<Pair>();
    for (int i : set1) {
        for (int j : set2) {
            pairs.add(new Pair(i, j));
        }
    }
    

    【讨论】:

    • 我会将该 List 设置为 Set,并让 Pair 实现适当的 equals() 和可能的 hashcode()。
    • @GustavKarlsson 你的意思是this :)?
    【解决方案3】:

    通常你会像这样遍历两个数组:

    for (int element1 : array1) {
       for (int element2 : array2) {
          .....
       } 
    }
    

    【讨论】:

      【解决方案4】:
      public static void main(String[] args) {
              int[] array1 = new int[] {1,2,3,4};
              int[] array2 = new int[] {5,6,7,8};
              String[] result = new String[array1.length * array2.length];
              int count = 0;
              for (int i : array1) {
                  for (int j : array2) {
                      result[count++] = "{" + i + ", " + j + "}";
                  }
              }
              for (String str : result) {
                  System.out.println(str);
              }
          }
      

      【讨论】:

        【解决方案5】:

        如果你想避免重复的对,在外循环的当前位置开始内循环。

        for(int i = 0; i < array1.length; i++)
        {
            for(int j = i + 1; j < array2.length; j++)
            {
                //do stuff
            }
        }
        

        【讨论】:

          【解决方案6】:

          您希望将一对对象视为可比较对象,然后创建一组对。请注意,使用此解决方案,您需要将数组存储为对象(例如整数)而不是基元(例如 int)。有关更多信息,请查看Convert an array of primitive longs into a List of Longs

          public class MyPair<A extends Comparable<A> > implements Comparable<MyPair<A>> {
            public A first; //You may want to make these private and implement getters, setters, etc
            public A second;
            public MyPair(A f, A s) { first = f; second = s; }
            public int compareTo(MyPair<A> o) {
               int cmp = first.compareTo(o.first);
               if(cmp == 0) cmp = second.compareTo(o.second);
               return cmp;
            }
            public String toString() {
              return "{"+first+","+second+"}";
            }
          }
          
          public static void main(String[] args) {
            Integer[] x = new Integer[]{1,2,3,4};
            Integer[] y = new Integer[]{5,6,7,8};
            Set<MyPair<Integer> > mypairs = new HashSet<MyPair<Integer> >();
            for(Integer f : x) 
            {
              for(Integer s : y) {
                MyPair<Integer> tmp = new MyPair<Integer>(f,s);
                mypairs.add(tmp);
              }
            }
            for(MyPair<Integer> pair : mypairs) {
              println(pair);
            }
          }
          

          【讨论】:

            猜你喜欢
            • 2018-11-24
            • 1970-01-01
            • 1970-01-01
            • 2015-09-28
            • 2016-01-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多