我想知道使用 Guava 12 Collections2.permutations()是否可以限制排列的大小?
更准确地说,我想在n个元素的列表中获取k个大小的排列的列表,而不是获取所有n个大小的排列的列表。
当前,如果我传递4个水果的列表,则 permutations()目前将返回24个4尺寸排列的列表,尽管我只想获取4个唯一的3尺寸排列。
假设我有4种水果的 list :
["Banana", "Apple", "Orange", "Peach"]
如果我只对3号排列感兴趣,请返回以下内容:
["Banana", "Apple", "Orange"]
["Banana", "Apple", "Peach"]
["Banana", "Orange", "Peach"]
["Apple", "Orange", "Peach"]
任何人都可以提供解决方案的任何提示吗?谢谢 !
最佳答案
这段代码可以计算出变化,然后对每个3的唯一集合运行排列。
也就是说,对于“A”,“B”,“C”,“D”,可能性为[[A,B,C],[A,B,D],[A,C,D],[B,C, D]]。然后,我们计算每个三人(或n人)的排列,并将可能性添加到列表中。
:PermutationsOfN.processSubsets(List set,int k)返回:
[[A,B,C],[A,B,D],[A,C,D],[B,C,D]]
再进一步 PermutationsOfN.permutations(列表列表,int size)返回:
[[A,B,C],[A,C,B],[C,A,B],[C,B,A],[B,C,A],[B,A,C],[ A,B,D],[A,D,B],[D,A,B],[D,B,A],[B,D,A],[B,A,D],[A, C,D],[A,D,C],[D,A,C],[D,C,A],[C,D,A],[C,A,D],[B,C, D],[B,D,C],[D,B,C],[D,C,B],[C,D,B],[C,B,D]]
import java.util.Collection;
import java.util.List;
import com.google.common.collect.Collections2;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
public class PermutationsOfN<T> {
public static void main( String[] args ) {
List<String> f = Lists.newArrayList( "A", "B", "C", "D" );
PermutationsOfN<String> g = new PermutationsOfN<String>();
System.out.println( String.format( "n=1 subsets %s", g.processSubsets( f, 1 ) ) );
System.out.println( String.format( "n=1 permutations %s", g.permutations( f, 1 ) ) );
System.out.println( String.format( "n=2 subsets %s", g.processSubsets( f, 2 ) ) );
System.out.println( String.format( "n=2 permutations %s", g.permutations( f, 2 ) ) );
System.out.println( String.format( "n=3 subsets %s", g.processSubsets( f, 3 ) ) );
System.out.println( String.format( "n=3 permutations %s", g.permutations( f, 3 ) ) );
System.out.println( String.format( "n=4 subsets %s", g.processSubsets( f, 4 ) ) );
System.out.println( String.format( "n=4 permutations %s", g.permutations( f, 4 ) ) );
System.out.println( String.format( "n=5 subsets %s", g.processSubsets( f, 5 ) ) );
System.out.println( String.format( "n=5 permutations %s", g.permutations( f, 5 ) ) );
}
public List<List<T>> processSubsets( List<T> set, int k ) {
if ( k > set.size() ) {
k = set.size();
}
List<List<T>> result = Lists.newArrayList();
List<T> subset = Lists.newArrayListWithCapacity( k );
for ( int i = 0; i < k; i++ ) {
subset.add( null );
}
return processLargerSubsets( result, set, subset, 0, 0 );
}
private List<List<T>> processLargerSubsets( List<List<T>> result, List<T> set, List<T> subset, int subsetSize, int nextIndex ) {
if ( subsetSize == subset.size() ) {
result.add( ImmutableList.copyOf( subset ) );
} else {
for ( int j = nextIndex; j < set.size(); j++ ) {
subset.set( subsetSize, set.get( j ) );
processLargerSubsets( result, set, subset, subsetSize + 1, j + 1 );
}
}
return result;
}
public Collection<List<T>> permutations( List<T> list, int size ) {
Collection<List<T>> all = Lists.newArrayList();
if ( list.size() < size ) {
size = list.size();
}
if ( list.size() == size ) {
all.addAll( Collections2.permutations( list ) );
} else {
for ( List<T> p : processSubsets( list, size ) ) {
all.addAll( Collections2.permutations( p ) );
}
}
return all;
}
}
值得一提的是meriton,其答案here帮助我解决了这个问题。