Java ассоциативный массив

Как я могу создать и получить ассоциативные массивы в Java, как я могу в PHP?

Например:

$arr[0]['name'] = 'demo';
$arr[0]['fname'] = 'fdemo';
$arr[1]['name'] = 'test';
$arr[1]['fname'] = 'fname';

Ответ 1

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"); 

Подробнее см. официальную документацию

Ответ 2

В 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"

Ответ 3

Вы можете выполнить это через Карты. Что-то вроде

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);

Ответ 4

В Java нет такой вещи, как ассоциативный массив. Его ближайший родственник - это 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

Ответ 5

Посмотрите на интерфейс Карта и на конкретный класс HashMap.

Чтобы создать карту:

Map<String, String> assoc = new HashMap<String, String>();

Чтобы добавить пару ключ-значение:

assoc.put("name", "demo");

Чтобы получить значение, связанное с ключом:

assoc.get("name")

И, конечно, вы можете создать массив карт, так как вам кажется, что вы хотите:

Map<String, String>[] assoc = ...

Ответ 7

В Java нет ассоциативных массивов, ближайшая вещь, которую вы можете получить, это Интерфейс карты

Вот пример с этой страницы.

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}

Ответ 8

Ну, я также искал Ассоциативный массив и нашел список карт лучшим решением.

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);

}


}

Ответ 9

В отличие от языков, таких как PHP, в Java нет ассоциативных массивов. Более удобным методом использования эквивалентного ассоциативного массива является использование HashMap, где вы можете использовать ключ HashMap для обеспечения качества ассоциативного массива.

Ответ 10

Ассоциативные массивы в 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

Ответ 11

Использовать ArrayList < Карта < 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}]

Ответ 12

В JDK 1.5 (http://tinyurl.com/3m2lxju) есть даже примечание: "ПРИМЕЧАНИЕ: этот класс устарел. Новые реализации должны реализовать интерфейс карты, а не расширять этот класс". С уважением, N.

Ответ 13

На самом деле Java поддерживает ассоциативные массивы, они называются словарями!

Ответ 14

Подумав об этом, я хотел бы выбросить кортежи как более универсальный способ решения этой проблемы. Хотя кортежи не являются родными для 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 предоставленными классами и методами.

Ответ 15

Object[][] data = {
{"mykey1", "myval1"},
{"mykey2", "myval2"},
{new Date(), new Integer(1)},
};

Да, для этого требуется итерация для поиска значения по ключу, но если вам нужны все они, это будет лучший выбор.

Ответ 16

Относительно комментария PHP "Нет, PHP это не понравится". На самом деле, PHP будет продолжать прерывать, если вы не установите некоторые очень ограничительные (для PHP) уровни исключений/ошибок (и, возможно, даже не тогда).

Что произойдет по умолчанию, так это то, что доступ к несуществующему элементу array/out of bounds "unsets" имеет значение, которое вы назначаете. НЕТ, это НЕ НЕ. Из того, что я понимаю, у PHP есть линия Perl/C. Таким образом, есть: unset и non existing variables, значения, которые ARE установлены, но имеют NULL, Boolean False значения, а затем все остальное, что стандартные langauges. Вы должны протестировать их отдельно, ИЛИ выберите ПРАВИЛЬНУЮ оценку, встроенную в функцию/синтаксис.