#java
Вопрос:
Есть ли какой-нибудь способ получить доступ к карте Java, такой как C ?
В C работает следующий фрагмент кода:
map<string, int> myMap;
string str = "okay";
myMap[str] = 69;
myMap[str] ;
cout<<myMap[str]<<endl;
приведенный выше код работает отлично и показывает 70 в консоли.
Есть ли что-нибудь подобное на Яве?
Комментарии:
1. Существует интерфейс карты для Java
2.
myMap.get("key")
в Java работает так же, какmyMap["key"]
и вC
3. Если вы имеете в виду что-то вроде «индексирования» — доступ с использованием скобок
[]
, то нет, java не имеет такой прямой функциональности4. @Oo.oO: за исключением того, что он работает только для чтения значения, а не для записи (что и делает строка с
). Я думаю, что C называет эту разницу значением lvalue по сравнению с значением rvalue, но я не уверен в этом на 100%.
Ответ №1:
И да, и нет.
Да, в этом, очевидно, вы можете получить аналогичный результат в коде Java.
Нет, в том, что многие из используемых вами концепций не существуют подобным образом, поэтому код Java будет выглядеть совсем по-другому.
Основной пример
На тривиальном уровне эквивалент map<string,int>
есть Map<String, Integer>
. Обратите внимание, что int
это не может быть использовано здесь, так как Java-генераторы не поддерживают примитивные типы в качестве аргументов типа, поэтому вам нужно будет использовать оболочку. В коде эта разница будет в основном незаметна благодаря автоматическому боксу.
Но Map
это интерфейс, поэтому вам нужно будет указать, какую реализацию вы хотите использовать. HashMap
это выбор по умолчанию, если у вас нет особых требований.
Map<String, Integer> myMap = new HashMap<>();
В Java нет (пользовательской) перегрузки операторов, поэтому вам нужно будет позвонить .put()
, чтобы добавить значение на карту:
String str = "okay";
myMap.put(str, 69); // nice
И из-за той же проблемы, а также из-за того, что Integer
объекты неизменяемы, следующая строка будет выглядеть немного уродливее в Java:
myMap.put(str, myMap.get(str) 1);
Печать-это тогда просто это:
System.out.println(myMap.get(str));
Альтернатива 1: Используйте compute
Одна из альтернатив (которую я лично нахожу излишней) — использовать compute
метод и подобное лямбда-выражение (есть также computeIfPresent
и computeIfAbsent
с очевидными ограничениями).:
myMap.compute(str, (k, v) -> v 1);
Альтернатива 2: используйте AtomicInteger
(или int[]
) вместо Integer
Другая альтернатива-использовать AtomicInteger
что-то вроде вашей ценности. В этом случае вам было бы на самом деле наплевать на то, что AtomicInteger
имеет атомарные операции, но используйте его как «изменяемый Integer
» в некотором роде.
Map<String, AtomicInteger> myMap = new HashMap<>();
String str = "okay";
myMap.put(str, new AtomicInteger(69));
myMap.get(str).incrementAndGet();
Поскольку AtomicInteger
она изменчива, вам не нужно изменять карту, чтобы изменить значение, на которое она указывает. Некоторые люди используют одноэлементный массив (например new int[1]
), чтобы получить аналогичный эффект. Я бы счел оба варианта использования немного избитыми и лично предпочел бы более явные AtomicInteger
:
Map<String, int[]> myMap = new HashMap<>();
String str = "okay";
myMap.put(str, new int[] { 69 });
myMap.get(str)[0] ;
Комментарии:
1. Спасибо, это было очень полезно.
Ответ №2:
Вы можете попробовать использовать HashMap для этой цели, если я правильно понял, что вы хотите использовать пару ключ-значение.
HashMap<String, Integer> map = new HashMap<>();
map.put("okay", 10);
map.get("okay");
Для получения дополнительной информации вы можете проверить
https://www.geeksforgeeks.org/java-util-hashmap-in-java-with-examples/