【问题标题】:How to get all combination of values in a Treemap如何获取 Treemap 中的所有值组合
【发布时间】:2016-03-03 10:49:34
【问题描述】:

我有一个包含以下值的地图:

TreeMap<String, String> params = new TreeMap<>();
        params.put("Has GPS – based Lat/Long",  "Yes, No");
        params.put("Ad Size", "320x480, 300x250");
        params.put("Integration", "Direct, Indirect");
        params.put("Vdo Ad Formats", "Max, Min, Med");
        params.put("App/Mobile Targeting", "Mobile Web, App");

现在我想要来自以下值的所有组合:

320x480, Yes, Direct, Max, Mobile Web
320x480, Yes, Direct, Max, App
300x250, Yes, Direct, Max, APP
300x250, Yes, Indirect, Max, Mobile Web
300x250, Yes, Direct, Max, Mobile Web
300x250, No, Direct, Max, Mobile Web
etc....

尝试了解决方案,它根本没有给我所有的组合。

        List<String> keysList = new ArrayList<>();
        keysList.addAll(params.keySet());

        //1. iterating the keys list
        for(int i=0; i<keysList.size(); i++)
        {   
            String x = "";
            String [] values_00 = map.get(keysList.get(i)).split(",");

            //2. iterating array of values
            for(int a0=0; a0<values_00.length; a0++)
            {
                //3. Iterating the next available keys from the list
                for(int j=i+1; j<keysList.size(); j++)
                {
                    String [] values_01 = map.get(keysList.get(j)).split(",");

                    //4. Iterating values of next array of values of next available keys
                    for(int a1=0; a1<values_01.length; a1++)
                    {
                        x = values_00[a0] + "  " + values_01[a1];
                        System.out.println(x);
                    }
                }
            }
        }

【问题讨论】:

标签: java combinations


【解决方案1】:

用 Java-8 不是很困难:

Stream<String> combinations = params.values().stream()
        .<Supplier<Stream<String>>>map(str -> () -> Pattern.compile(", ").splitAsStream(str))
        .reduce((s1, s2) -> () -> s1.get().flatMap(e1 -> s2.get().map(e2 -> e1 + ", " + e2)))
        .get().get();
combinations.forEach(System.out::println);

输出是:

320x480, Mobile Web, Yes, Direct, Max
320x480, Mobile Web, Yes, Direct, Min
320x480, Mobile Web, Yes, Direct, Med
320x480, Mobile Web, Yes, Indirect, Max
320x480, Mobile Web, Yes, Indirect, Min
...
300x250, App, No, Indirect, Max
300x250, App, No, Indirect, Min
300x250, App, No, Indirect, Med

请注意,地图元素在您使用 TreeMap 时已重新排序,它按键排序。如果您需要特定的顺序,请改用LinkedHashMap

【讨论】:

  • 这可行,但我无法清楚地理解这一点。任何方式谢谢。
【解决方案2】:

这类问题通常用递归程序来解决。我放了一个可运行的例子on GitHub。要了解它的作用,基本上你想为每个其他选项值打印每个选项值。

您将拥有一个长度等于选项数量的缓冲区,并且每个选项都有一个(递归)调用。在递归函数中

  • 当缓冲区已满时,您将打印结果
  • 否则,循环选项中的值并再次调用递归函数

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-04
    • 2013-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多