Как разрешить дублирование ключей на карте в java? - PullRequest
1 голос
/ 10 апреля 2020
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        Map<String,Double> map=new LinkedHashMap<String,Double>();
        line=br.readLine();        
        while(!line.equals("End")) {
            String[]arr2=line.split(" ");
            String model=arr2[1];
            Double distance=Double.parseDouble(arr2[2]);
            map.put(model, distance);
            line=br.readLine();
        }


Я пытаюсь распечатать все ключи и значения, хотя они дубликаты.
Мой ввод должен быть
Audi 15,3
Audi 8,6
BMW 45
Конец

И когда я пытаюсь распечатать его, он дает мне только (Audi 8.6 и Bmw 45).
Мне нужно напечатать дважды audi!

Ответы [ 5 ]

0 голосов
/ 10 апреля 2020

Это не мое любимое занятие, но есть обходной путь, позволяющий дублировать карты. LinkedHashMap, который вы используете, использует метод hashCode, определенный в Object. Вы можете создать класс-оболочку для String, не переопределяя реализацию по умолчанию equals и hashCode. Это позволит вам добавить «дубликаты» в вашу коллекцию, поскольку Java считает, что они не идентичны.

Пример класса:

public class StringWrapper {
   private String value;

   public StringWrapper(String value) {
      this.value = value;
   }

// getters and setters
// no equals and hashcode
}
0 голосов
/ 10 апреля 2020

Вы не можете иметь дубликаты ключей на прямой Java карте. Один из подходов - использовать его для хранения List значений вместо одного значения и перебирать их при печати результатов:

BufferedReader be = new BufferedReader(new InputStreamReader(System.in));
Map<String, List<Double>> map = new LinkedHashMap<>();
line=br.readLine();        
while(!line.equals("End")) {
    String[] arr2 = line.split(" ");
    String model = arr2[1];
    Double distance = Double.parseDouble(arr2[2]);
    map.computeIfAbsent(model, m -> new LinkedList<>()).add(distance);
    line = br.readLine();
}

И затем, когда вы распечатываете его :

for (Map.Entry<String, List<Double>> entry : map) {
    for (Double d : entry.getValue()) {
        System.out.println(entry.getKey() + " " d);
    }
}
0 голосов
/ 10 апреля 2020

Лучший подход - использование объектно-ориентированного программирования.

Создать новый класс

class Result {
    String model;
    String distance;

    public Result(String model, String distance) {
        this.model = model;
        this.distance = distance;
    }
}

Изменить тип

с

Map<String,Double> map = new LinkedHashMap<String,Double>();

на:

List<Result> list = new ArrayList<Result>();

Изменить добавление метод

от:

map.put(model, distance);

до:

list.add(Result(model, distance));
0 голосов
/ 10 апреля 2020

Объявление вашей карты выглядит как Map<String, Double>, что означает, что только одно значение Double может быть сопоставлено с ключом String

Вы можете просто изменить Double на List<Double> и сопоставить ключ со списком, тогда ваш случай будет выглядеть так:

BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
Map<String, List<Double>> map=new LinkedHashMap<>();
line=br.readLine(); 
while(!line.equals("End")) {
    String[] arr2=line.split(" ");
    String model=arr2[1];
    Double distance=Double.parseDouble(arr2[2]);
    List<Double> distances = map.computeIfAbsent(model, key -> new ArrayList<>());
    distances.add(distance);
    line=br.readLine();
}

Эта структура более правильная, то есть модель Audi имеет список различных расстояний. Введите один Audi и список значений.

0 голосов
/ 10 апреля 2020

Вы не можете иметь дубликаты ключей на карте. Лучшее, что вы можете сделать, - это создать список значений. т.е. Map<String, List<Double>> map = new HashMap<String, List<Double>>();

...