Reputation: 1128
For example, if I have an array list like the following:
String[] fruits = {"apple", "banana", "strawberry", "kiwi", "grape"};
and I want to return a list of lists that contain combination of items in fruits starting from "banana" such as:
["banana"]
["banana","apple"]
["banana", "apple","strawberry",]
["banana", "apple","strawberry","kiwi"]
["banana", "apple","strawberry","kiwi", "grape"]
["banana", "strawberry"]
........
What is the fastest way and cleanest way to return the list of lists of combination?
Upvotes: 0
Views: 364
Reputation: 1344
Here is an Iterative solution
import java.util.LinkedList;
import java.util.List;
public class TestPractice {
public static void main(String[] args) {
String[] x = {"apple", "banana", "strawberry", "kiwi", "grape"};
System.out.println(subsets(x));
}
public static<E> List<LinkedList<E>> subsets(E[] x) {
LinkedList<LinkedList<E>> subsets = new LinkedList<>();
subsets.add(new LinkedList<>());
for(E s: x) {
LinkedList<LinkedList<E>> temp = new LinkedList<>();
for(LinkedList<E> l1: subsets) {
LinkedList<E> l2 = new LinkedList<>(l1);
l2.add(s);
temp.add(l2);
}
subsets.addAll(temp);
}
subsets.remove(0);
return subsets;
}
}
[[apple],
[banana],
[apple, banana],
[strawberry],
[apple, strawberry],
[banana, strawberry],
[apple, banana, strawberry],
[kiwi],
[apple, kiwi],
[banana, kiwi],
[apple, banana, kiwi],
[strawberry, kiwi],
[apple, strawberry, kiwi],
[banana, strawberry, kiwi],
[apple, banana, strawberry, kiwi],
[grape],
[apple, grape],
[banana, grape],
[apple, banana, grape],
[strawberry, grape],
[apple, strawberry, grape],
[banana, strawberry, grape],
[apple, banana, strawberry, grape],
[kiwi, grape], [apple, kiwi, grape],
[banana, kiwi, grape],
[apple, banana, kiwi, grape],
[strawberry, kiwi, grape],
[apple, strawberry, kiwi, grape],
[banana, strawberry, kiwi, grape],
[apple, banana, strawberry, kiwi, grape]]
Upvotes: 1
Reputation: 7724
This should do what you asked for:
import java.util.*;
public class Main {
public static String[] fruits = {"apple", "banana", "strawberry", "kiwi", "grape"};
public static void combs(Deque<String> curr, int index){
if(index == fruits.length){
if(curr.size() == 0) return;
System.out.print("[");
for (Iterator itr = curr.iterator(); itr.hasNext();) {
System.out.print("\"" + itr.next() + "\"");
if(itr.hasNext()) System.out.print(", ");
}
System.out.println("]");
}
else{
curr.addLast(fruits[index]);
combs(curr, index + 1);
curr.removeLast();
combs(curr, index + 1);
}
}
public static void main(String[] args) {
combs(new ArrayDeque<String>(), 0);
}
}
OUTPUT:
["apple", "banana", "strawberry", "kiwi", "grape"]
["apple", "banana", "strawberry", "kiwi"]
["apple", "banana", "strawberry", "grape"]
["apple", "banana", "strawberry"]
["apple", "banana", "kiwi", "grape"]
["apple", "banana", "kiwi"]
["apple", "banana", "grape"]
["apple", "banana"]
["apple", "strawberry", "kiwi", "grape"]
["apple", "strawberry", "kiwi"]
["apple", "strawberry", "grape"]
["apple", "strawberry"]
["apple", "kiwi", "grape"]
["apple", "kiwi"]
["apple", "grape"]
["apple"]
["banana", "strawberry", "kiwi", "grape"]
["banana", "strawberry", "kiwi"]
["banana", "strawberry", "grape"]
["banana", "strawberry"]
["banana", "kiwi", "grape"]
["banana", "kiwi"]
["banana", "grape"]
["banana"]
["strawberry", "kiwi", "grape"]
["strawberry", "kiwi"]
["strawberry", "grape"]
["strawberry"]
["kiwi", "grape"]
["kiwi"]
["grape"]
Upvotes: 1
Reputation: 81
import java.util.ArrayList;
import java.util.List;
/**
*
*
*
*
*
*
* @author shikai.liu
* @version 1.0
* @since JDK1.7
*/
public class Teaaa {
public static void main(String[]args){
String[] fruits = { "apple", "banana", "strawberry", "kiwi", "grape" };
List<List<String>> allList = new ArrayList<>();
List<String> list = new ArrayList<>();
list.add("banana");
allList.add(new ArrayList<>(list));
for (int j = 0; j < fruits.length; j++) {
list.clear();
list.add("banana");
if (!fruits[j].equals("banana"))
list.add(fruits[j]);
for (int i = j + 1; i < fruits.length; i++) {
if (!fruits[i].equals("banana"))
list.add(fruits[i]);
allList.add(new ArrayList<String>(list));
}
}
System.out.println(allList);
}
}
the output is : [[banana], [banana, apple], [banana, apple, strawberry], [banana, apple, strawberry, kiwi], [banana, apple, strawberry, kiwi, grape], [banana, strawberry], [banana, strawberry, kiwi], [banana, strawberry, kiwi, grape], [banana, strawberry, kiwi], [banana, strawberry, kiwi, grape], [banana, kiwi, grape]]
Upvotes: 1
Reputation: 2723
Why reinvent the wheel. If you are allow to use Guava you can take advantage of its Sets
class and Sets.combinations(Set<E> set, int size)
method:
String[] fruits = {"apple", "banana", "strawberry", "kiwi", "grape"};
Set<String> set = Set.of(fruits);
List<List<String>> combinations = IntStream.rangeClosed(1, set.size()).boxed()
.flatMap(i -> Sets.combinations(set, i).stream().map(List::copyOf))
.collect(Collectors.toList());
combinations.forEach(System.out::println);
Output
[banana]
[apple]
[grape]
[kiwi]
[strawberry]
[banana, apple]
[banana, grape]
[apple, grape]
[banana, kiwi]
[apple, kiwi]
[grape, kiwi]
[banana, strawberry]
[apple, strawberry]
[grape, strawberry]
[kiwi, strawberry]
[banana, apple, grape]
[banana, apple, kiwi]
[banana, grape, kiwi]
[apple, grape, kiwi]
[banana, apple, strawberry]
[banana, grape, strawberry]
[apple, grape, strawberry]
[banana, kiwi, strawberry]
[apple, kiwi, strawberry]
[grape, kiwi, strawberry]
[banana, apple, grape, kiwi]
[banana, apple, grape, strawberry]
[banana, apple, kiwi, strawberry]
[banana, grape, kiwi, strawberry]
[apple, grape, kiwi, strawberry]
[banana, apple, grape, kiwi, strawberry]
Upvotes: 0
Reputation: 2724
Run this :
class Combination {
static void permutingArray(List<String> list, int element) {
for (int i = element; i < list.size(); i++) {
java.util.Collections.swap(list, i, element);
permutingArray(list, element + 1);
java.util.Collections.swap(list, element, i);
}
if (element == list.size() - 1) {
System.out.println(java.util.Arrays.toString(list.toArray()));
}
}
public static void main(String[] args) {
String[] fruits = {"apple", "banana", "strawberry", "kiwi", "grape"};
Combination
.permutingArray(java.util.Arrays.asList(fruits), 0);
}
}
Output :
[apple, banana, strawberry, kiwi, grape]
[apple, banana, strawberry, grape, kiwi]
[apple, banana, kiwi, strawberry, grape]
[apple, banana, kiwi, grape, strawberry]
[apple, banana, grape, kiwi, strawberry]
[apple, banana, grape, strawberry, kiwi]
[apple, strawberry, banana, kiwi, grape]
[apple, strawberry, banana, grape, kiwi]
[apple, strawberry, kiwi, banana, grape]
[apple, strawberry, kiwi, grape, banana]
[apple, strawberry, grape, kiwi, banana]
[apple, strawberry, grape, banana, kiwi]
[apple, kiwi, strawberry, banana, grape]
[apple, kiwi, strawberry, grape, banana]
[apple, kiwi, banana, strawberry, grape]
[apple, kiwi, banana, grape, strawberry]
[apple, kiwi, grape, banana, strawberry]
[apple, kiwi, grape, strawberry, banana]
[apple, grape, strawberry, kiwi, banana]
[apple, grape, strawberry, banana, kiwi]
[apple, grape, kiwi, strawberry, banana]
[apple, grape, kiwi, banana, strawberry]
[apple, grape, banana, kiwi, strawberry]
[apple, grape, banana, strawberry, kiwi]
[banana, apple, strawberry, kiwi, grape]
[banana, apple, strawberry, grape, kiwi]
[banana, apple, kiwi, strawberry, grape]
[banana, apple, kiwi, grape, strawberry]
[banana, apple, grape, kiwi, strawberry]
[banana, apple, grape, strawberry, kiwi]
[banana, strawberry, apple, kiwi, grape]
[banana, strawberry, apple, grape, kiwi]
[banana, strawberry, kiwi, apple, grape]
[banana, strawberry, kiwi, grape, apple]
[banana, strawberry, grape, kiwi, apple]
[banana, strawberry, grape, apple, kiwi]
[banana, kiwi, strawberry, apple, grape]
[banana, kiwi, strawberry, grape, apple]
[banana, kiwi, apple, strawberry, grape]
[banana, kiwi, apple, grape, strawberry]
[banana, kiwi, grape, apple, strawberry]
[banana, kiwi, grape, strawberry, apple]
[banana, grape, strawberry, kiwi, apple]
[banana, grape, strawberry, apple, kiwi]
[banana, grape, kiwi, strawberry, apple]
[banana, grape, kiwi, apple, strawberry]
[banana, grape, apple, kiwi, strawberry]
[banana, grape, apple, strawberry, kiwi]
[strawberry, banana, apple, kiwi, grape]
[strawberry, banana, apple, grape, kiwi]
[strawberry, banana, kiwi, apple, grape]
[strawberry, banana, kiwi, grape, apple]
[strawberry, banana, grape, kiwi, apple]
[strawberry, banana, grape, apple, kiwi]
[strawberry, apple, banana, kiwi, grape]
[strawberry, apple, banana, grape, kiwi]
[strawberry, apple, kiwi, banana, grape]
[strawberry, apple, kiwi, grape, banana]
[strawberry, apple, grape, kiwi, banana]
[strawberry, apple, grape, banana, kiwi]
[strawberry, kiwi, apple, banana, grape]
[strawberry, kiwi, apple, grape, banana]
[strawberry, kiwi, banana, apple, grape]
[strawberry, kiwi, banana, grape, apple]
[strawberry, kiwi, grape, banana, apple]
[strawberry, kiwi, grape, apple, banana]
[strawberry, grape, apple, kiwi, banana]
[strawberry, grape, apple, banana, kiwi]
[strawberry, grape, kiwi, apple, banana]
[strawberry, grape, kiwi, banana, apple]
[strawberry, grape, banana, kiwi, apple]
[strawberry, grape, banana, apple, kiwi]
[kiwi, banana, strawberry, apple, grape]
[kiwi, banana, strawberry, grape, apple]
[kiwi, banana, apple, strawberry, grape]
[kiwi, banana, apple, grape, strawberry]
[kiwi, banana, grape, apple, strawberry]
[kiwi, banana, grape, strawberry, apple]
[kiwi, strawberry, banana, apple, grape]
[kiwi, strawberry, banana, grape, apple]
[kiwi, strawberry, apple, banana, grape]
[kiwi, strawberry, apple, grape, banana]
[kiwi, strawberry, grape, apple, banana]
[kiwi, strawberry, grape, banana, apple]
[kiwi, apple, strawberry, banana, grape]
[kiwi, apple, strawberry, grape, banana]
[kiwi, apple, banana, strawberry, grape]
[kiwi, apple, banana, grape, strawberry]
[kiwi, apple, grape, banana, strawberry]
[kiwi, apple, grape, strawberry, banana]
[kiwi, grape, strawberry, apple, banana]
[kiwi, grape, strawberry, banana, apple]
[kiwi, grape, apple, strawberry, banana]
[kiwi, grape, apple, banana, strawberry]
[kiwi, grape, banana, apple, strawberry]
[kiwi, grape, banana, strawberry, apple]
[grape, banana, strawberry, kiwi, apple]
[grape, banana, strawberry, apple, kiwi]
[grape, banana, kiwi, strawberry, apple]
[grape, banana, kiwi, apple, strawberry]
[grape, banana, apple, kiwi, strawberry]
[grape, banana, apple, strawberry, kiwi]
[grape, strawberry, banana, kiwi, apple]
[grape, strawberry, banana, apple, kiwi]
[grape, strawberry, kiwi, banana, apple]
[grape, strawberry, kiwi, apple, banana]
[grape, strawberry, apple, kiwi, banana]
[grape, strawberry, apple, banana, kiwi]
[grape, kiwi, strawberry, banana, apple]
[grape, kiwi, strawberry, apple, banana]
[grape, kiwi, banana, strawberry, apple]
[grape, kiwi, banana, apple, strawberry]
[grape, kiwi, apple, banana, strawberry]
[grape, kiwi, apple, strawberry, banana]
[grape, apple, strawberry, kiwi, banana]
[grape, apple, strawberry, banana, kiwi]
[grape, apple, kiwi, strawberry, banana]
[grape, apple, kiwi, banana, strawberry]
[grape, apple, banana, kiwi, strawberry]
[grape, apple, banana, strawberry, kiwi]
Upvotes: 0