Ответы:
Java не поддерживает ассоциативные массивы, однако этого легко достичь с помощью Map
. Например,
Map<String, String> map = new HashMap<String, String>();
map.put("name", "demo");
map.put("fname", "fdemo");
// etc
map.get("name"); // returns "demo"
Еще более точным для вашего примера (поскольку вы можете заменить String любым объектом, который соответствует вашим потребностям) будет объявление:
List<Map<String, String>> data = new ArrayList<>();
data.add(0, map);
data.get(0).get("name");
Смотрите официальную документацию для получения дополнительной информации
ArrayList
почти во всех случаях из-за (неожиданных?) Различий в производительности. Но это другое обсуждение.
HashMap
, и, конечно, не без преднамеренного сравнения поведения и поиска лучшего коэффициента загрузки для вашего варианта использования. Единственная причина указать начальный размер - если вы заранее знаете, что карта будет очень большой. HashMap
не тратит (много) памяти, если она пуста, но если вы намереваетесь создать большую карту, вы можете сохранить несколько размеров массива, указав его размер заранее.
В Java нет ассоциативных массивов, как в PHP.
Существуют различные решения для того, что вы делаете, например, использование карты, но это зависит от того, как вы хотите искать информацию. Вы можете легко написать класс, который содержит всю вашу информацию и хранить ее экземпляры в ArrayList
.
public class Foo{
public String name, fname;
public Foo(String name, String fname){
this.name = name;
this.fname = fname;
}
}
А потом...
List<Foo> foos = new ArrayList<Foo>();
foos.add(new Foo("demo","fdemo"));
foos.add(new Foo("test","fname"));
Таким образом, вы можете получить к ним доступ, как ...
foos.get(0).name;
=> "demo"
Вы можете сделать это через Карты. Что-то вроде
Map<String, String>[] arr = new HashMap<String, String>[2]();
arr[0].put("name", "demo");
Но когда вы начнете использовать Java, я уверен, что вы обнаружите, что если вы создадите класс / модель, которая представляет ваши данные, ваши лучшие варианты. я бы сделал
class Person{
String name;
String fname;
}
List<Person> people = new ArrayList<Person>();
Person p = new Person();
p.name = "demo";
p.fname = "fdemo";
people.add(p);
В Java нет такого понятия, как ассоциативный массив. Его ближайший родственник - a Map
, который строго типизирован, однако имеет менее элегантный синтаксис / API.
Это самое близкое, что вы можете получить на основе вашего примера:
Map<Integer, Map<String, String>> arr =
org.apache.commons.collections.map.LazyMap.decorate(
new HashMap(), new InstantiateFactory(HashMap.class));
//$arr[0]['name'] = 'demo';
arr.get(0).put("name", "demo");
System.out.println(arr.get(0).get("name"));
System.out.println(arr.get(1).get("name")); //yields null
LazyMap.decorate
и InstantiateFactory
для чего?
Посмотрите на интерфейс Map и конкретный класс HashMap .
Чтобы создать карту:
Map<String, String> assoc = new HashMap<String, String>();
Чтобы добавить пару ключ-значение:
assoc.put("name", "demo");
Чтобы получить значение, связанное с ключом:
assoc.get("name")
И, конечно же, вы можете создать массив карт, как это кажется, что вы хотите:
Map<String, String>[] assoc = ...
Ну, я также искал ассоциативный массив и нашел список карт как лучшее решение.
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class testHashes {
public static void main(String args[]){
Map<String,String> myMap1 = new HashMap<String, String>();
List<Map<String , String>> myMap = new ArrayList<Map<String,String>>();
myMap1.put("URL", "Val0");
myMap1.put("CRC", "Vla1");
myMap1.put("SIZE", "Vla2");
myMap1.put("PROGRESS", "Vla2");
myMap.add(0,myMap1);
myMap.add(1,myMap1);
for (Map<String, String> map : myMap) {
System.out.println(map.get("URL"));
}
//System.out.println(myMap);
}
}
HashMap<Integer, HashMap<String, String>> hash;
Java не имеет ассоциативных массивов, самое близкое, что вы можете получить, это интерфейс Map
Вот пример с этой страницы.
import java.util.*;
public class Freq {
public static void main(String[] args) {
Map<String, Integer> m = new HashMap<String, Integer>();
// Initialize frequency table from command line
for (String a : args) {
Integer freq = m.get(a);
m.put(a, (freq == null) ? 1 : freq + 1);
}
System.out.println(m.size() + " distinct words:");
System.out.println(m);
}
}
Если запустить с:
java Freq if it is to be it is up to me to delegate
Ты получишь:
8 distinct words:
{to=3, delegate=1, be=1, it=2, up=1, if=1, me=1, is=2}
Ассоциативные массивы в Java как в PHP:
SlotMap hmap = new SlotHashMap();
String key = "k01";
String value = "123456";
// Add key value
hmap.put( key, value );
// check if key exists key value
if ( hmap.containsKey(key)) {
//.....
}
// loop over hmap
Set mapkeys = hmap.keySet();
for ( Iterator iterator = mapkeys.iterator(); iterator.hasNext();) {
String key = (String) iterator.next();
String value = hmap.get(key);
}
Дополнительную информацию см. В разделе Класс SoftHashMap: https://shiro.apache.org/static/1.2.2/apidocs/org/apache/shiro/util/SoftHashMap.html.
Использовать ArrayList <Map <String, String>>
Вот пример кода:
ArrayList<Map<String, String>> products = new ArrayList<Map<String, String>>();
while (iterator.hasNext()) {
Map<String, String> product = new HashMap<String, String>();
Element currentProduct = iterator.next();
product.put("id",currentProduct.get("id"));
product.put("name" , currentProduct.get("name") );
products.add(product );
}
System.out.println("products : " + products);
Вывод :
продукты: [{id = 0001, name = prod1}, {id = 0002, name = prod2}]
На самом деле Java поддерживает ассоциативные массивы, они называются словарями!
Размышляя больше об этом, я хотел бы выбросить кортежи как более общий способ решения этой проблемы. Хотя кортежи не являются родными для Java, я использую Javatuples, чтобы предоставить мне ту же функциональность, которая существует в других языках. Пример того, как справиться с заданным вопросом:
Map<Pair<Integer, String>, String> arr = new HashMap<Pair<Integer, String>, String>();
Pair p1 = new Pair(0, "name");
arr.put(p1, "demo");
Мне нравится этот подход, потому что он может быть распространен на тройки и другие группы более высокого порядка с помощью API и классов и методов.
Что касается комментария PHP «Нет, PHP не понравится». На самом деле, PHP будет продолжать пускаться в пух, если вы не установите очень ограничительные (для PHP) уровни исключений / ошибок (и, возможно, даже тогда).
По умолчанию будет происходить то, что доступ к несуществующей переменной / элементу массива out of bounds 'отменяет' ваше значение, которое вы присваиваете. НЕТ, это НЕ НУЛЬ. PHP имеет родословную Perl / C, насколько я понимаю. Итак, есть: неустановленные и несуществующие переменные, значения, которые установлены, но имеют значение NULL, логические значения False, затем все остальное, что есть в стандартных языках. Вы должны проверить их отдельно, ИЛИ выбрать ПРАВУЮ оценку, встроенную в функцию / синтаксис.
NullPointerException
если внешняя карта не содержит карту для входа0
. Разве PHP не разрешает использовать $ arr [0] ['name'] (я вообще не знаю этот язык)?