Creating non-dual pairs of permutations from 2 lists in Java on the fly

I watched a lot of different permutation messages in Java, but none of them matched my score, so I decided to post.

So, I have 2 List<Integer> , and I need to generate all pairs of permutations with no duplicates , where one element of the pair is in the first list and the second one in the second list.

For example, if I have:

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

Then I want in the output:

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

Note that (3, 2) is not here, since I already have (2, 3)

I could not find any library to do something even remotely, I found that guava has something similar to Permutations , but it seems to have been stopped recently or something like that.

In addition, I would like not to store the list in memory, since it can be quite large, I only need to iterate through the pairs one at a time, so I'm trying to find ways to generate them on the fly . I was thinking of implementing an Iterable<Pair> , but it seems like I can't write anything that looks effective.

If you know libraries that already do such things that are also very useful!

+4
source share
1 answer

What about

 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); } } 

Exit

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

Source: https://habr.com/ru/post/1415605/


All Articles