【问题标题】:Finding combination of all strings in an array in Java在Java中查找数组中所有字符串的组合
【发布时间】:2017-03-22 13:46:32
【问题描述】:

我正在尝试在不重复的数组{"A","B","C"} 中查找字符串组合,并且元素的顺序应保留在子集中。 所需订单为[["B","C"], ["A","C"], ["A","B"], ["A","B","C"], ["A"], ["C"], ["B"]]。我曾尝试使用question 中的答案编写逻辑,发现元素的顺序没有保留。

public static Set <JSONArray> getCombinations( int k , JSONArray properties )
        {
            Set <JSONArray> combinations = new LinkedHashSet <JSONArray>();
            try
                {
                    if ( k == 0 )
                        {
                            combinations.add( new JSONArray() );
                            return combinations;
                        }
                    for ( int i = 0 ; i < properties.length() ; i++ )
                        {
                            String element = properties.getString( i );
                            JSONArray sublist = getSublist( properties , i + 1 );
                            combinations.add( sublist );
                            Set <JSONArray> combinations2 = getCombinations( k - 1 , sublist );
                            for ( JSONArray previous : combinations2 )
                                {

                                    previous.put( element );
                                    combinations.add( previous );
                                }
                        }
                }
            catch ( Exception e )
                {
                    System.out.println( "Exception :: " + e );
                }
            return combinations;
        }

    public static JSONArray getSublist( JSONArray list , int i ) throws JSONException
        {
            JSONArray sublist = new JSONArray();
            for ( int j = i ; j < list.length() ; j++ )
                {
                    sublist.put( list.getString( j ) );
                }
            return reverseArray( sublist );
        }

输出为 ::[["B","C"], ["C","A"], ["B","A"], ["C","B","A"], ["A"], ["C"], ["B"]]。但我需要像 ["C","A"] 一样保留订单 ["A","C"]。任何想法都会有所帮助。

PS:子集的顺序无关紧要,但子集中元素的顺序是。

【问题讨论】:

  • 为什么 b,c 应该在 a,c 之前?还是a,b?我不知道“保持初始顺序”。还是只是:应该是 a,c 而不是 c,a?
  • 是的,它应该是 a,b 而不是 b,a。子集的顺序无关紧要,但子集中元素的顺序是。

标签: java arrays combinations


【解决方案1】:

组合可以用一个数字表示 - 在二进制形式中,每个位置的数字表示元素是否存在。例如。 5=101 -> {A, C}

因此,让我们遍历组合 = 范围内的数字并获取与该数字对应的元素,这意味着那些索引存在于组合的二进制表示中的元素。

 public class Combins {

            static String[] a = new String[] { "A", "B", "C" };

            public static void main(final String[] args) {

                final int maxbit = 1 << a.length;

                //for each combination given by a (binary) number 'p'...
                for (int p = 0; p < maxbit; p++) {
                    final List<String> res = new ArrayList<String>();

                    //evaluate if array 'a' element at index 'i' is present in combination (and include it if so)
                    for (int i = 0; i < a.length; i++) {
                        if ((1 << i & p) > 0) {
                            res.add(a[i]);
                        }
                    }
                    System.out.println(Arrays.toString(res.toArray()));
                }
            }
        }

输出是:

[]
[A]
[B]
[A, B]
[C]
[A, C]
[B, C]
[A, B, C]

【讨论】:

  • 哪里:为了让你的答案对他人真正有帮助,你可能想解释一下你正在使用的条件......你看,那些代码唯一的答案是“有点好”,但不是真的。如果您想说服人们支持(而不是反对)...考虑添加一些解释。
  • 在代码审查中,我会拒绝这个,因为疯狂和不可读的位摆弄。我不知道那里发生了什么。
猜你喜欢
  • 2018-08-18
  • 2017-01-02
  • 1970-01-01
  • 2018-06-03
  • 1970-01-01
  • 1970-01-01
  • 2020-06-19
  • 2020-02-02
  • 2012-02-26
相关资源
最近更新 更多