当前位置: 首页 > 知识库问答 >
问题:

生成笛卡尔乘积Java

益思博
2023-03-14

我正在尝试对一个后端服务器进行负载测试,并将一些配置解析到一个标签对象中。我正在尝试生成< code>Label对象的笛卡尔乘积,这将是一个< code>Metric对象。

Label {
   String name;
   String labe;
}

我有一个列表

[[name: "office_instance"value: "office_instance_0", name: "office_instance"value: "office_instance_1", name: "office_instance"value: "office_instance_2", name: "office_instance"value: "office_instance_3"], [name: "office_type"value: "office_type_0", name: "office_type"value: "office_type_1", name: "office_type"value: "office_type_2", name: "office_type"value: "office_type_3"], [name: "resource_type"value: "resource_type_0", name: "resource_type"value: "resource_type_1", name: "resource_type"value: "resource_type_2", name: "resource_type"value: "resource_type_3"], [name: "resource"value: "resource_0", name: "resource"value: "resource_1", name: "resource"value: "resource_2", name: "resource"value: "resource_3"], [name: "resource_group_name"value: "resource_group_name_0", name: "resource_group_name"value: "resource_group_name_1", name: "resource_group_name"value: "resource_group_name_2", name: "resource_group_name"value: "resource_group_name_3"], [name: "scope"value: "scope_0", name: "scope"value: "scope_1", name: "scope"value: "scope_2", name: "scope"value: "scope_3"]]

因为这是从配置生成的,所以生成时间序列的代码需要是动态的。在本例中,labelList的大小为5,每个单独的列表为4个标签。因此,度量对象的总数将为4*4*4*4*4。

度量对象的示例将是

[[ name: "office_instance"value: "office_instance_0", name: "office_type"value: "office_type_0", name: "resource_type"value: "resource_type_0", name: "resource"value: "resource_0", name: "resource_group_name"value: "resource_group_name_0", name: "scope"value: "scope_0"][name: "office_instance"value: "office_instance_0", name: "office_type"value: "office_type_0", name: "resource_type"value: "resource_type_0", name: "resource"value: "resource_0", name: "resource_group_name"value: "resource_group_name_0", name: "scope"value: "scope_1"]......]

生成指标有两种方法,一种是通过 addLabels 方法一次添加一个标签

 Metric.newBuilder().addLabels(Label obj).build()

或者通过< code>addAllLabels方法添加

 Metric.newBuilder().addAllLabels(List<Label> obj).build()

我试图以迭代/递归的方式做到这一点,但它变得非常复杂和混乱。我检查了是否有java8替代方案。如果我能够获得列表

我在这里引用了Java 8中流的笛卡尔乘积作为流(仅使用流)。但还是想不通。任何帮助将不胜感激。

编辑:发现番石榴有笛卡尔产品API,这可能会有所帮助,不确定它是否是最优化的。


共有1个答案

邴英毅
2023-03-14

在我看来,你需要一个递归函数。这就是我想出的:

public class Cartesian {

    public static void main(String[] args) {
        List<List<Label>> labelList = Arrays.asList(//
                Arrays.asList( //
                        new Label("office_instance", "office_instance_0"), //
                        new Label("office_instance", "office_instance_1") //
                ), //
                Arrays.asList( //
                        new Label("office_type", "office_type_0"), //
                        new Label("office_type", "office_type_1") //
                ), //
                Arrays.asList( //
                        new Label("resource_type", "resource_type_0"), //
                        new Label("resource_type", "resource_type_1") //
                )//

        );
        List<List<Label>> result = generateCombinations(labelList);

        System.out.println(result);
    }

    private static List<List<Label>> generateCombinations(List<List<Label>> labels) {
        List<List<Label>> result = new ArrayList<>();
        // for each label in first list
        // generate combinations of labels from the rest of the list
        for (Label label : labels.get(0)) {
            if (labels.size() > 1) {
                for (List<Label> entry : generateCombinations(labels.subList(1, labels.size()))) {
                    entry.add(label);
                    result.add(entry);
                }
            } else {
                // base case
                result.add(new ArrayList<>(Arrays.asList(label)));
            }
        }
        return result;
    }

    private static class Label {
        String name;
        String label;

        Label(String name, String label) {
            this.name = name;
            this.label = label;
        }

        @Override
        public String toString() {
            return "(name: " + name + ", label: " + label + ")";
        }
    }
}

为了简洁起见,我没有使用完整的列表。

输出(手动格式化):

[
    [
        (name: resource_type, label: resource_type_0),
        (name: office_type, label: office_type_0),
        (name: office_instance, label: office_instance_0)
    ],
    [
        (name: resource_type, label: resource_type_1),
        (name: office_type, label: office_type_0),
        (name: office_instance, label: office_instance_0)
    ],
    [
        (name: resource_type, label: resource_type_0),
        (name: office_type, label: office_type_1),
        (name: office_instance, label: office_instance_0)
    ],
    [
        (name: resource_type, label: resource_type_1),
        (name: office_type, label: office_type_1),
        (name: office_instance, label: office_instance_0)
    ],
    [
        (name: resource_type, label: resource_type_0),
        (name: office_type, label: office_type_0),
        (name: office_instance, label: office_instance_1)
    ],
    [
        (name: resource_type, label: resource_type_1),
        (name: office_type, label: office_type_0),
        (name: office_instance, label: office_instance_1)
    ],
    [
        (name: resource_type, label: resource_type_0),
        (name: office_type, label: office_type_1),
        (name: office_instance, label: office_instance_1)
    ],
    [
        (name: resource_type, label: resource_type_1),
        (name: office_type, label: office_type_1),
        (name: office_instance, label: office_instance_1)
    ]
]
 类似资料:
  • 现在有这几个数据 要转换成

  • 本文向大家介绍map reduce实现笛卡尔乘积?相关面试题,主要包含被问及map reduce实现笛卡尔乘积?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 在Map阶段,将来自矩阵A的元素标识成l条<key,value>的形式,key=(i,k),k=1,2,…,l。value=(j,)。将来自矩阵B的元素标识成l条<key,value>的形式,key=(i,k),k=1,2,…,m。

  • 的结果将是二维数组: 我试图做的是使用流在Java中编写这个笛卡尔乘积函数。 到目前为止,我有以下Java版本: 我对问题的猜测是: 我需要在某个地方使用收集器(可能在之后) 标识的数据类型错误

  • 我有如下地图: 我想得到如下数据: 我尝试了如下: 但这不是我想要的代码,因为地图数据是动态的和不可预知的。 所以我应该像下面这样得到地图数据,但不能像我想要的那样:

  • 问题内容: 我有两个pandas数据框: 获得其笛卡尔积的最佳实践是什么(当然不用像我这样明确地编写它)? 问题答案: 如果每行都有一个重复的键,则可以使用merge生成笛卡尔乘积(就像在SQL中一样)。 输出:

  • 问题内容: 在Tensorflow中有什么简单的方法可以像itertools.product一样做笛卡尔积吗?我想获得两个张量(和)的元素组合,在Python中可以通过itertools作为。我正在Tensorflow中寻找替代方案。 问题答案: 我将在此假定和均为一维张量。 为了得到两者的笛卡尔积,我会用的组合和: 您使用LEN(一) LEN(B) 2张量,其中的元件的每个组合结束并且在最后一维