【问题标题】:How to return a list of combinations of a list of items in Java starting with a specific item?如何返回以特定项目开头的 Java 项目列表的组合列表?
【发布时间】:2020-07-15 18:02:49
【问题描述】:

例如,如果我有一个如下所示的数组列表:

String[] fruits = {"apple", "banana", "strawberry", "kiwi", "grape"};

我想返回一个列表列表,其中包含从“香蕉”开始的 fruits 中的项目组合,例如:

 ["banana"]
 ["banana","apple"]
 ["banana", "apple","strawberry",]
 ["banana", "apple","strawberry","kiwi"]
 ["banana", "apple","strawberry","kiwi", "grape"]
 ["banana", "strawberry"]
 ........
 

返回组合列表的最快和最干净的方法是什么?

【问题讨论】:

  • 您是否有意以“香蕉”而不是“苹果”开头?
  • 没有。第一项实际上可以是任何东西。
  • 我确定它是正确的,但请看我的回答
  • 哦,不。你误会了。当我说第一个项目可以是任何东西时,我的意思是我可以选择任何项目作为我的起始项目。
  • 好的,对不起。但是能否请您扩展您想要的结果,以便我们更好地识别您想要什么?

标签: java algorithm combinations permutation


【解决方案1】:
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);
    }
}

输出是: [[香蕉],[香蕉,苹果],[香蕉,苹果,草莓],[香蕉,苹果,草莓,猕猴桃],[香蕉,苹果,草莓,猕猴桃,葡萄],[香蕉,草莓],[香蕉,草莓,猕猴桃],[香蕉,草莓,猕猴桃,葡萄],[香蕉,草莓,猕猴桃],[香蕉,草莓,猕猴桃,葡萄],[香蕉,猕猴桃,葡萄]]

【讨论】:

    【解决方案2】:

    这应该可以满足您的要求:

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

    输出:

    ["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"]
    

    【讨论】:

      【解决方案3】:

      这是一个迭代解决方案

      为什么要迭代?

      • 比递归方法更快
      • 没有堆栈溢出。

      为什么不是 ArrayList?

      • ArrayLists 内部使用一个数组,因此保留了额外的空间。

      为什么是泛型方法?

      • 它现在可以处理任何可以减少代码冗余的数据类型
      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]]
      

      【讨论】:

        【解决方案4】:

        运行这个

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

        输出

        [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]
        

        【讨论】:

        • 这是错误的,OP说这是所有组合,而不是所有排列,[banana]是一种可能性。
        【解决方案5】:

        为什么要重新发明轮子。如果您允许使用Guava,您可以利用它的Sets 类和Sets.combinations(Set&lt;E&gt; set, int size) 方法:

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

        输出

        [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]
        

        【讨论】:

          猜你喜欢
          • 2018-11-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-02-10
          • 2016-01-21
          • 1970-01-01
          • 2012-03-22
          相关资源
          最近更新 更多