1

配列をループしようとしていますが、この問題が発生しています。この配列をループすると、次のようになります。

{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}

したがって、2つの要件は、ペアが一意の関係である必要があり(1,2と2,1を持つことはできません)、同じであってはならないということです。2つの数値を比較して等しいかどうかを確認することで、同じでないことは簡単にできますが、最初の要件に問題があります。

4

6 に答える 6

6

更新後、このようなものを探していると思います

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}
于 2012-07-10T15:55:43.073 に答える
2

セット 1 と 2 からすべての可能な順序付けられていないペアを見つけようとしている場合は、次のようにします。

List<Pair> pairs = new ArrayList<Pair>();
for (int i : set1) {
    for (int j : set2) {
        pairs.add(new Pair(i, j));
    }
}
于 2012-07-10T14:46:49.593 に答える
0

ペアの繰り返しを避けたい場合は、外側のループの現在の位置で内側のループを開始します。

for(int i = 0; i < array1.length; i++)
{
    for(int j = i + 1; j < array2.length; j++)
    {
        //do stuff
    }
}
于 2012-07-10T14:59:45.553 に答える
0

通常、次のように 2 つの配列をループします。

for (int element1 : array1) {
   for (int element2 : array2) {
      .....
   } 
}
于 2012-07-10T14:47:28.853 に答える
0
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);
        }
    }
于 2012-07-10T14:54:43.140 に答える
0

オブジェクトのペアを比較対象として扱い、ペアのセットを作成します。このソリューションでは、配列をプリミティブ (int など) ではなくオブジェクト (Integer など) として保存する必要があることに注意してください。詳細については、プリミティブ long の配列を Long のリストに変換するを確認してください。

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);
  }
}
于 2012-07-10T15:42:29.840 に答える