web-dev-qa-db-ja.com

Java連想配列

PHPでできるように、どのようにしてJavaで連想配列を作成し、取得することができますか?

例えば:

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

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

詳細については公式文書を参照

328
Johan Sjöberg

JavaにはPHPのような連想配列はありません。

Mapを使用するなど、さまざまな解決策がありますが、情報の検索方法によって異なります。すべての情報を保持するクラスを簡単に作成し、それらのインスタンスを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"
46
Jeremy

あなたは地図を介してこれを達成することができます。何かのようなもの

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);
20
Amir Raminfar

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
12

Map インターフェース、そして具象クラス HashMap を見てください。

地図を作成するには:

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

キーと値のペアを追加するには

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

キーに関連付けられている値を取得するには

assoc.get("name")

そして、確かに、それはあなたが望むものであるように思われるので、あなたはマップの配列を作成することができます:

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

Perlのハッシュと同等のJava

HashMap<Integer, HashMap<String, String>> hash;
5
DVK

Javaは連想配列を持っていません、あなたが得ることができる最も近いものは Map interface です

そのページのサンプルです。

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}
5
OscarRyz

よく私はまた連想配列を探していたし、最善の解決策としてマップのリストを見つけました。

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

}


}
5
alchemist

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、名前= prod1}、{id = 0002、名前= prod2}]

3
abahet

PHPのようにJavaの連想配列:

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

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

はい、これはキーで値を検索するための反復を必要とします、しかしあなたがそれらの全てを必要とするなら、これは最良の選択でしょう。

1
msangel

JDK 1.5(http://tinyurl.com/3m2lxju)にも、「注:このクラスは廃止されています。新しい実装では、このクラスを拡張するのではなく、Mapインタフェースを実装する必要があります」との注記もあります。よろしく、N。

1
shadrik

実際、Javaは辞書と呼ばれる連想配列をサポートしています。

0
Matt Seidlitz

それについてもっと考えて、私はこの問題に対処するより汎用的な方法としてタプルを捨てたいと思います。タプルは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が提供するクラスとメソッドを使用して、トリプルやその他の高次グループに拡張できるので、私はこのアプローチが好きです。

0
demongolem