#java #java-8 #hashmap #java-stream #key-value
#java #java-8 #hashmap #java-поток #ключ-значение
Вопрос:
Пожалуйста, помогите мне научиться перемещаться между картами. У меня есть хэш-карта Map<Строка, список>
sourceHashMapFind=.put("AAA", Arrays.asList(-5.6, 7.9, 5.7, 6.3));
sourceHashMapFind=.put("BBB", Arrays.asList(0.6, 5.8, 6.9, 8.0));
sourceHashMapFind=.put("CCC", Arrays.asList(0.5, 5.6, 6.9, 8.0));
И я хотел бы сгенерировать другую карту ==> HashMap<Строка, двойная>
Вот мои критерии. Если абсолютное значение позиции 0 больше 1. —> затем сохраните ключ и значение в новой хэш-карте queryPositions. Заранее благодарю вас!
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class NewClass {
public static void main(String[] args) {
Map<String, List<Double>> sourceHashMapFind = new HashMap<>();
sourceHashMapFind.put("AAA", Arrays.asList(-5.6, 7.9, 5.7, 6.3));
sourceHashMapFind.put("BBB", Arrays.asList(0.6, 5.8, 6.9, 8.0));
sourceHashMapFind.put("CCC", Arrays.asList(0.5, 5.6, 6.9, 8.0));
HashMap<String, Double> queryPositions = sourceHashMapFind.entrySet()
.stream()
.sorted(Map.Entry.comparingByKey())
.filter(entry -> Math.abs(entry.getValue().get(0)) > 1.0)
.distinct()
.collect(Collectors.toMap(entry -> entry.getKey(), entry -> entry.getValue()));
}
}
Вот результат запуска
run:
Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - incompatible types: inference variable R has incompatible bounds
equality constraints: java.util.Map<K,U>
upper bounds: java.util.HashMap<java.lang.String,java.lang.Double>,java.lang.Object
at P2020_0928_stackOverflow_MyQuestion.NewClass.main(NewClass.java:21)
C:UsersUser1AppDataLocalNetBeansCache9.0executor-snippetsrun.xml:111: The following error occurred while executing this line:
C:UsersUser1AppDataLocalNetBeansCache9.0executor-snippetsrun.xml:94: Java returned: 1
BUILD FAILED (total time: 1 second)
И, пожалуйста, смотрите сообщение. Спасибо, ребята!
https://i.stack.imgur.com/iaK7j.jpg
Комментарии:
1. Каков ваш ожидаемый результат? Какой результат кода у вас есть?
2. Привет, возможно, используйте
entry.getValue().get(0)
для части значения вашейtoMap
функции.3. @Sweeper: ожидаемый результат должен состоять в том, чтобы сохранить строку «AAA» и двойное значение -5,6, сохраненное в позициях запроса HashMap<String, Double> . Поскольку абсолютное значение (-5.6) больше 1.0.
4. @IronMan: Попробовал предложение, оно не работает. Вот результат до сих пор. Спасибо вам обоим.
5. Каким должно быть значение конечной карты? Первое значение списка? Его абсолютное значение? Сумма всех значений списка? Пожалуйста, уточните
Ответ №1:
Вы были близки, но нет смысла сортировать записи, а затем собирать их в map ( HashMap
) по умолчанию, который не сохраняет порядок вставки. Кроме того, почему вы используете .distinct()
?
Вот как я бы это сделал:
Map<String, Double> queryPositions = sourceHashMapFind.entrySet().stream()
.filter(e -> Math.abs(e.getValue().get(0)) > 1.0)
.collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue().get(0)));
Это предполагает, что вы хотите, чтобы первый элемент каждого списка был значением каждой записи новой карты.
Если вам нужны записи, отсортированные по ключу, вы можете создать TreeMap
:
Map<String, Double> queryPositions = sourceHashMapFind.entrySet().stream()
.filter(e -> Math.abs(e.getValue().get(0)) > 1.0)
.collect(Collectors.toMap(
e -> e.getKey(),
e -> e.getValue().get(0),
(oldValue, newValue) -> newValue,
TreeMap::new)));
При этом используется перегруженная версия Collectors.toMap
, которая ожидает завод для карты.
Комментарии:
1. Привет, fps, большое вам спасибо! Чтобы ответить на вопрос, я действительно новичок в Java, поэтому использовал distinct() . Еще раз спасибо!
2. @User
distinct()
не нужен, потому что вы передаете карту, а у карты никогда не бывает дубликатов ключей. Таким образом, у вас также не будет дубликатов ключей в вашей окончательной карте