Java 拆分贴图的关键点,并使用新关键点和关联值创建新贴图

Java 拆分贴图的关键点,并使用新关键点和关联值创建新贴图,java,dictionary,java-8,java-stream,java-9,Java,Dictionary,Java 8,Java Stream,Java 9,我有一个对象的列表,其中每个对象都包含一个X,Y值(双倍)和一个名称字符串。由于我有多个名称相同的条目对应于坐标,因此我希望将每个名称链接到所有坐标,这是我通过创建类型为 输出示例: One [[0.1,0.1,0.1],[0.2,0.3,0.4]] One,Two [[0.1,0.1] ,[0.4,0.5]] One,Two,Three [[0.1,0.1] ,[0.6,0.7]] 我现在要做的是在有逗号的地方拆分名称

我有一个
对象的
列表
,其中每个对象都包含一个X,Y值(
双倍)和一个名称
字符串
。由于我有多个名称相同的条目对应于坐标,因此我希望将每个名称链接到所有坐标,这是我通过创建类型为

输出示例:

One             [[0.1,0.1,0.1],[0.2,0.3,0.4]]
One,Two         [[0.1,0.1]    ,[0.4,0.5]]         
One,Two,Three   [[0.1,0.1]    ,[0.6,0.7]]
我现在要做的是在有逗号的地方拆分名称,
,并获得以下结果:

One   [[0.1,0.1,0.1,0.1,0.1,0.1],[0.2,0.3,0.4,0.5,0.6,0.7]]
Two   [[0.01,0.01,0.01,0.01]    ,[0.4,0.5,0.6,0.7]]                    
Three [[0.01,0.01]              ,[0.6,0.7]]
我的代码是:

Map<String, List<Coordinates>> newList = coordinateList.stream()
                .collect(Collectors.groupingBy(Coordinates::getName));
我得到的错误是:

The method flatMapping((<no type> entry) -> {}, Collectors.toList()) is undefined for the type Collectors

仍然不走运,我经常会遇到错误
无法推断flatMap(函数的类型参数。似乎您没有使用java9。如果您使用java9,则前一种方法与
收集器配合使用。flatMapping
会起作用。但我仍然看不到在此处创建新的
Map.Entry
的任何意义。看看这个解决方案

private static final Pattern COMMA_DELIMITER = Pattern.compile(",\\s*");

Map<String, Set<Coordinate>> nameToCoordinates = coordinates.stream()
    .flatMap(
        c -> COMMA_DELIMITER.splitAsStream(c.getName())
            .map(n -> new Coordinate(n, c.getX(), c.getY())))
    .collect(Collectors.groupingBy(Coordinate::getName, Collectors.toSet()));
出于某种原因,如果您确实需要使用在第一步创建的中介映射,那么您的解决方案将如下所示

newList.values().stream().flatMap(Collection::stream)
    .flatMap(
        c -> COMMA_DELIMITER.splitAsStream(c.getName())
            .map(n -> new Coordinate(n, c.getX(), c.getY())))
    .collect(Collectors.groupingBy(Coordinate::getName, Collectors.toSet()));
这是输出

{One=[[name=One,x=0.1,y=0.2],[name=One,x=0.1,y=0.4],[name=One, x=0.1,y=0.3],[name=One,x=0.1,y=0.5],[name=One,x=0.1,y=0.6], [name=One,x=0.1,y=0.7],[name=Two,x=0.1,y=0.4],[name=Two, x=0.1,y=0.5],[name=Two,x=0.1,y=0.6],[name=Two,x=0.1,y=0.7], 三个=[[name=Three,x=0.1,y=0.6],[name=Three,x=0.1,y=0.7]]


您的第一次尝试对我很有效。请注意,
Collectors.flatMapping
直到Java 9才到达。您确定已配置正确的目标JDK吗?@teppic I添加了最新的Java库(11.0…)到我的项目文件夹,但仍然是相同的错误。感谢提出的解决方案,第一种方法对我有效。我也尝试了第二种方法,但没有得到正确的格式。第二种方法也应该有效。这是我得到的输出。
{one=[[name=one,x=0.1,y=0.4],[name=one,x=0.1,y=0.2],[name=one,x=0.1,y=0.5],[name=one,x=0.1,y=0.3],[姓名=1,x=0.1,y=0.6],[姓名=1,x=0.1,y=0.7],[姓名=2,x=0.1,y=0.4],[姓名=2,x=0.1,y=0.5],[姓名=2,x=0.1,y=0.6],[姓名=2,x=0.1,y=0.7],[姓名=3,x=0.1,y=0.6],[姓名=3,x=0.1,y=0.7]>
private static final Pattern COMMA_DELIMITER = Pattern.compile(",\\s*");

Map<String, Set<Coordinate>> nameToCoordinates = coordinates.stream()
    .flatMap(
        c -> COMMA_DELIMITER.splitAsStream(c.getName())
            .map(n -> new Coordinate(n, c.getX(), c.getY())))
    .collect(Collectors.groupingBy(Coordinate::getName, Collectors.toSet()));
@Override
public int hashCode() {
    int result = name.hashCode();
    result = 31 * result + Double.hashCode(x);
    result = 31 * result + Double.hashCode(y);
    return result;
}

@Override
public boolean equals(Object obj) {
    return obj instanceof Coordinate && ((Coordinate) obj).getX() == x 
        && ((Coordinate) obj).getY() == y
        && ((Coordinate) obj).getName().equals(name);
}
newList.values().stream().flatMap(Collection::stream)
    .flatMap(
        c -> COMMA_DELIMITER.splitAsStream(c.getName())
            .map(n -> new Coordinate(n, c.getX(), c.getY())))
    .collect(Collectors.groupingBy(Coordinate::getName, Collectors.toSet()));