C , как карта в Java?

#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/