Как поместить строку, хранящуюся в карте дерева, в java

#java #string #hashmap #treemap

Вопрос:

У меня есть строка a = «1x^2 2x^3 3x^4 4x^4», и я хочу сохранить мощность в каждом термине в качестве ключа и коэффициента в качестве значения для карты деревьев. Поскольку есть две одинаковые степени с разными коэффициентами, мне нужно суммировать коэффициенты так, чтобы результат был {2=1,3=2,4=7}. Потому что treemap.put(ключ) может переопределить предыдущее значение только тем же ключом, поэтому я мог получить результат только как{2=1,3=2,4=4}. Как это решить?

Комментарии:

1. Проверьте containsKey() , есть ли уже ключ. Если да, объедините текущее значение с вашим новым значением, прежде чем поместить его на карту.

2. Это полезно, просто проверьте ключ, спасибо!

Ответ №1:

Рекомендуется использовать Map::merge функцию для накопления значений для нескольких одинаковых ключей:

 Maplt;Integer, Integergt; terms = new TreeMaplt;gt;(); for (String term : a.split("\s ")) {  String[] pair = term.split("x\^");  terms.merge(Integer.valueOf(pair[1]), Integer.valueOf(pair[0]), Integer::sum); } System.out.println(terms);  

Выход:

 {2=1, 3=2, 4=7}  

С помощью Stream API это можно решить Collectors.toMap аналогичным образом, используя в Integer::sum качестве функции слияния:

 String a = "1x^2 2x^3 3x^4 4x^4 ";  Maplt;Integer, Integergt; terms = Arrays.stream(a.split("\s ")) // Streamlt;Stringgt;  .map(t -gt; t.split("x\^")) // Streamlt;String[]gt;  .collect(Collectors.toMap(  t -gt; Integer.valueOf(t[1]), // power as key  t -gt; Integer.valueOf(t[0]), // coefficient as value  Integer::sum, // add coefficients for the same power  TreeMap::new // supply TreeMap as result  ));  System.out.println(terms);  

Выход:

 {2=1, 3=2, 4=7}  

Комментарии:

1. Это умный метод!