2012-06-01 35 views
4

我一直在尋找關於Java中排列的很多不同的帖子,但沒有一個符合我的賬單,所以我決定發佈。在Java中動態生成非重複排列的2列表對

所以我有2 List<Integer>,我需要生成所有置換對沒有重複其中對一個元件是在所述第一列表和第二個在第二列表中。

舉例來說,如果我有:

List<Integer> l1 = Arrays.asList(new Integer[] {1, 2, 3}); 
List<Integer> l1 = Arrays.asList(new Integer[] {2, 3, 4}); 

然後我想在輸出:

(1, 2), (1, 3), (1, 4), (2, 2), (2, 3), (2, 4), (3, 3), (3, 4) 

需要注意的是(3,2)是不是在這裏,因爲我已經有(2,3)

我找不到任何圖書館做甚至遠程關閉的東西,我發現guava有一些類似Permutations,但它似乎最近已停產或什麼的。

此外,我想不必將列表存儲在內存中,因爲它可能相當大,我只需要一次對一個對進行迭代,所以我試圖找到生成它們的方法在飛行。我正在考慮實施Iterable<Pair>,但我似乎無法寫出任何看起來高效的東西。

如果你知道庫已經做了這種東西,那也是非常有用的!

+0

我不認爲這是不存儲一些東西在內存中建立其對已經看到可行的。無論如何,你指的是哪種番石榴?我不認爲我們已經「停止」沿着這些方向的任何東西...... –

+0

我是錯的,但我認爲你的意思是套,而不是排列。排列關注訂單,因此您可以按不同順序保存值,並且它們不被視爲等同。套件不關心訂單,只關心他們的內容。不知道這是否會幫助您找到解決方案,但認爲它可能。 –

回答

5

如何

class Pair { 
    private int x, y; 

    Pair(int x, int y) { 
     this.x = x; 
     this.y = y; 
    } 

    @Override public int hashCode() { 
     int result = 1; 
     result = 31 * result + x; 
     result = 31 * result + y; 
     return result; 
    } 

    @Override public boolean equals(Object obj) { 
     if (this == obj)    return true; 
     if (!(obj instanceof Pair)) return false; 
     Pair tmp = (Pair) obj; 
     return (tmp.x == x && tmp.y == y) || (tmp.x == y && tmp.y == x); 
    } 

    public String toString() { 
     return "(" + x + "," + y + ")"; 
    } 
} 

class Testt { 
    public static void main(String[] args) { 
     List<Integer> l1 = Arrays.asList(1, 2, 3); 
     List<Integer> l2 = Arrays.asList(2, 3, 4); 

     Set<Pair> set = new HashSet<Pair>(); 
     for (int i : l1) 
      for (int j : l2) 
       set.add(new Pair(i, j)); 

     System.out.println(set); 
    } 
} 

輸出

[(1,2), (1,3), (1,4), (2,2), (2,3), (2,4), (3,3), (3,4)] 
+1

這聽起來相當不錯,謝謝,我沒有考慮套件...只是好奇,爲什麼你使用'LinkedHashSet'而不只是一個'HashSet'? –

+0

它應該是'HashSet'我測試了不同的想法之後,我忘了將它重新放回去。 – Pshemo