Как создать новую карту, разделив ключи картыкоторые содержат повторяющиеся имена - PullRequest
0 голосов
/ 18 февраля 2019

У меня есть Map типа <String, List<Object>>, где ключи этого Map - это имена (String), связанные с Object, который содержит координаты X и Y.

Пример:

Names (String)    Coordinates

Cord1             [[0.1,0.1,0.1],[0.2,0.3,0.4]]
Cord1,Cord2       [[0.1,0.1]    ,[0.4,0.5]]         
Cord1,Cord2,Cord3 [[0.1,0.1]    ,[0.6,0.7]]

Чего я хочу добиться, так это разделить имена при наличии запятой ,, чтобы у меня могли быть только отдельные имена, что также повлияет на координаты иизбежать повторения.

Пример того, чего я хотел бы достичь:

Cord1 [[0.1,0.1,0.1,0.1,0.1,0.1],[0.2,0.3,0.4,0.5,0.6,0.7]]
Cord2 [[0.01,0.01,0.01,0.01]    ,[0.4,0.5,0.6,0.7]]                    
Cord3 [[0.01,0.01]              ,[0.6,0.7]]

Есть ли способ сделать это?

РЕДАКТИРОВАТЬ:

IЯ не очень знаком с Java 8, который, по-видимому, является наиболее оптимальным способом сделать это, но я экспериментировал с чем-то вроде этого, которое до сих пор не работало:

List<String> list = Splitter.on(',').splitToList(value);
        for (String element : list) {
           //TO-DO
        }

Cord Object:

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

    public Cord(double x, double y, String name) {
        this.X=x;
        this.Y=y;
        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;
    }

}

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

Это решение для того, что я понял из вашего вопроса:

Map<String, List<Object>> doTheThing(Map<String, List<Object>> input){
  Map<String, List<Object>> retr = new Map<String, List<Object>>();
  for(String s1:input.keySet()){//for each Name on the original map
    String[] separatedByCommas = s1.split(",");//split the names by ","
    for(String s2:separatedByCommas){//for each separated by "," name
      if(!retr.containsKey(s2)){
        //if the separated by "," name is not on the retr map just put to the separated by "," name the contents of name
        retr.put(s2,input.get(s1));
      }else{
        //if the separated by "," name is on the retr map add to the separated by "," name the contents of name
        retr.put(s2,retr.get(s2).addAll(input.get(s1));//add to whats already in s2
      }
    }
    return retr;
  }
0 голосов
/ 18 февраля 2019

Существует потоковый способ с flatMapping из java-9:

import static java.util.stream.Collectors.*;

Map<String, List<Object>> collect = map.entrySet().stream()
        .flatMap(entry -> Arrays.stream(entry.getKey().split(","))
                .map(s -> new AbstractMap.SimpleEntry<>(s, entry.getValue())))
        .collect(groupingBy(Map.Entry::getKey, 
                flatMapping(entry -> entry.getValue().stream(), toList())));

Если вы не можете использовать java-9, это все еще может быть сделано потоковым API, ноэто будет намного более многословно.Вероятно, в этом случае вы должны рассмотреть решение для цикла for.

Map<String, List<Object>> collect1 = map.entrySet().stream()
        .flatMap(entry -> Arrays.stream(entry.getKey().split(","))
                .map(s -> new AbstractMap.SimpleEntry<>(s, entry.getValue())))
        .collect(groupingBy(Map.Entry::getKey, mapping(Map.Entry::getValue, toList())))
        .entrySet().stream()
        .flatMap(entry -> entry.getValue().stream()
                .flatMap(Collection::stream)
                .map(o -> new AbstractMap.SimpleEntry<>(entry.getKey(), o)))
        .collect(groupingBy(Map.Entry::getKey, mapping(Map.Entry::getValue, toList())));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...