#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. Это умный метод!