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

基于map的String元素创建新分组

彭胡媚
2023-03-14

我有一个名为坐标对象列表,每个坐标包含三个值。两个doublex、y类型和一个string名称。我的代码接收坐标项作为输入,并通过创建 类型的map来根据名称对它们进行分组。通过这种方式,我没有一对坐标与一个名字相关联,而是有一个名字与所有相应的坐标相关联。

例如。:

地图前:

[0.01,0.51] --> A
[0.01,0.56] --> A
[0.01,0.61] --> A
[0.01,0.66] --> AB
[0.01,0.71] --> ABC
[0.01,0.76] --> ABC

其中A、B和C是名称。如果多个名称出现在一起,则表示它们共享相同的坐标。

地图后:

[[0.01,0.01,0.01],[0.51,0.56,0.61]] --> A
[[0.01,0.01], [0.61,0.66]]          --> AB
[[0.01, 0.01], [0.71,0.76]]         --> ABC

我想要实现的是将每个名字从组中分离出来,并将所有坐标链接到那个名字。

例如。我想要达到的目标:

[[0.01,0.01,0.01,0.01,0.01,0.01],[0.51,0.56,0.61,0.66,0.71,0.76]] --> A
[[0.01,0.01,0.01,0.01], [0.61,0.66,0.71,0.76]]                    --> B
[[0.01,0.01], [0.71,0.76]]                                        --> C

创建映射并按名称对其分组的代码如下:

Map<String, List<Coordinates>> newList = coordinateList.stream()
                .collect(Collectors.groupingBy(Coordinates::getName));

有没有办法做到这一点?请注意,名称(例如ABC)不是用逗号或空格分隔的,但如果它有助于一个可能的解决方案,我已经知道如何这样做了(a,B,C)。

坐标类:

public class Coordinates {
    private double X;
    private double Y;
    private String name;

    public Coordinates(double dexp, double dent, String name) {
        this.X=dexp;
        this.Y=dent;
        this.name=name;
    }
    @Override
    public String toString() {
        return "["+X+","+Y+"]";
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public double getX() {
        return X;
    }
    public void setX(double x) {
        X = x;
    }
    public double getY() {
        return Y;
    }
    public void setY(double y) {
        Y = y;
    }

}

名称示例:

STEP(One)
STEP(Two)
STEP(One)STEP(Two)

共有1个答案

咸臻
2023-03-14

如果我没理解错的话,我们假设你已经可以很容易地到达你的第二张地图了。但是,这应该适用于任何一个映射,您甚至可以在此基础上稍微优化它。根据这个假设,使用map > ,我们可以根据输入进行累加/合并:

Map<String, List<Coordinate>> myComboMap = /* ... */;
Map<String, List<Coordinate>> myAbsoluteMap = new HashMap<>();
myComboMap.forEach((name, coords) -> {
    List<String> names = /* split up name into list, or just iterate */;
    names.forEach(n -> {
        //merge or create the results for each name
        myAbsoluteMap.compute(n, (key, old) -> {
            if (old == null) {
                //copy list to avoid changing old map
                return new ArrayList<>(coords);
            }
            //or append to an existing list
            old.addAll(coords);
            return old;
        });
    });
});

这也可以通过#flatmap和collectors#tomap使用流来完成,但是该解决方案将涉及创建相当多的对象,因此为了简单起见,我使用了一个副作用#foreach。

注意:这将创建一个单名到它们各自坐标的地图。您可以很容易地翻转该映射(两者都应该相当独特),尽管我自己不确定用例。请记住,如果两个名字在这张地图上有相同的坐标,那么翻转地图可能会导致丢失其中一个名字。因此,我保留了原样的答案,名称->坐标。

 类似资料:
  • 我的REST控制器需要以下格式的请求输入,它成功地将其转换为包含映射和字符串作为参数的Java对象: 我从html表单中获取数据,如下所示: 基本上,这段代码可以归结为: 这会导致包含{key1=的映射 但是,我最终会得到以下字符串:'{"myMap":{},"String":"myString"}'。所以我可能必须做一些不同的事情来对地图进行字符串化,但是我尝试的都不起作用。 有人能帮我吗?

  • 我正在尝试访问HTML代码中特定的元素。 定义元素的代码部分如下所示 。 在下面的第二行代码之后,我尝试声明表达式和,它们都返回java.lang.String类型的“oddrow cellcont” 但是,我尝试了下面的代码片段,它不能工作,因为循环中的条件返回false。我还尝试使用和、、、...以所有可能的组合使用if条件。 我肯定被困住了;我需要帮助。

  • 本文向大家介绍aurelia 基于命名约定创建自定义元素,包括了aurelia 基于命名约定创建自定义元素的使用技巧和注意事项,需要的朋友参考一下 示例 通过CustomElement在类名中简单地添加后缀,即可基于命名约定在Aurelia中创建一个基本的自定义元素。此后缀将由Aurelia自动删除。类名称的其余部分将被小写并使用连字符分隔,然后可用作元素名称。 示例: my-element.js

  • 问题内容: 我正在使用jQuery CSS函数设置某些元素的样式 这可行,但是页面加载后会动态创建部分元素。这应该是 我被创建的事件困住了。有任何想法吗? 问题答案: 创建的元素没有事件(无论如何都无法通用)。你可以 将规则添加到样式表,以便将其自动应用于新创建的元素 创建元素时,链接 css() 方法: 动态创建一个新的样式表:

  • 本文向大家介绍基于String变量的两种创建方式(详解),包括了基于String变量的两种创建方式(详解)的使用技巧和注意事项,需要的朋友参考一下 在java中,有两种创建String类型变量的方式: 第一种方式创建String变量时,首先查找JVM方法区的字符串常量池是否存在存放"abc"的地址,如果存在,则将该变量指向这个地址,不存在,则在方法区创建一个存放字面值"abc"的地址。 第二种方式

  • 根据一个字符串创建一个元素(不附加到 document )。 如果给定的字符串包含多个元素,则只返回第一个元素。 使用 document.createElement() 来创建一个新的元素。 将它的 innerHTML 设置为作为参数提供的字符串。 使用 ParentNode.firstElementChild 来返回字符串的元素版本。 const createElement = str => {