자바 연관 배열


214

PHP에서와 같이 Java로 연관 배열을 만들고 가져올 수 있습니까?

예를 들면 다음과 같습니다.

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

답변:


356

Java는 연관 배열을 지원하지 않지만을 사용하여 쉽게 달성 할 수 있습니다 Map. 예 :

Map<String, String> map = new HashMap<String, String>();
map.put("name", "demo");
map.put("fname", "fdemo");
// etc

map.get("name"); // returns "demo"

예를 들어 훨씬 더 정확한 것은 (문자열을 필요에 맞는 객체로 바꿀 수 있기 때문에) 다음과 같이 선언하는 것입니다.

List<Map<String, String>> data = new ArrayList<>();
data.add(0, map);
data.get(0).get("name"); 

자세한 내용은 공식 문서를 참조하십시오


2
이 발생합니다 NullPointerException외부지도 항목에 대한지도를 포함하지 않는 경우 0. $ arr [0] [ 'name']에서 PHP가 더 관용적이지 않습니까 (이 언어를 전혀 모릅니다)?
Tomasz Nurkiewicz

9
존재하지 않는 키에 액세스하려고하면 PHP가 마음에 들지 않습니다. :)
Svish

2
@ edem, 일부 구현이 필요했습니다. 오늘은 하지만, 내가 선호 ArrayList로 인해 (예상치 못한?) 성능 차이 거의 모든 경우를한다. 그러나 그것은 또 다른 토론입니다.
Johan Sjöberg

3
정확한 해시 크기를 초기화하고로드 팩터를 1로 설정하는 것을 잊지 마십시오. HashMap <String, String> (capacity, 1). 그렇지 않으면 엄청난 오버 헤드를 구현할 수 있으며 객체에는 많은 RAM이 필요합니다. ArrayList의 경우 +1이지만 답변을 편집하지 않는 이유는 무엇입니까?
Marcus

1
@Marcus " 정확한 해시 크기를 초기화하고로드 팩터를 1 " 로 설정하는 것을 잊지 마십시오. 조언은 어디서 얻습니까? 당신은 거의해야 결코 a의 부하 요인을 지정 HashMap의도적으로 동작을 벤치마킹 및 사용 사례에 대한 더 나은 부하 요인을 찾을 수없는 것은 확실합니다. 초기 크기를 지정하는 유일한 이유는 맵이 매우 크다는 것을 미리 알고 있기 때문입니다. HashMap비어있는 경우 (많은) 메모리를 낭비하지 않지만 큰 맵을 만들려는 경우 크기를 미리 지정하여 여러 배열 크기를 저장할 수 있습니다.
dimo414

47

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"

20

지도를 통해이 작업을 수행 할 수 있습니다. 같은 것

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

나는이 방법이 더 감사하다고 생각합니다. 모든 것이 너무 간단한 PHP에서 오는 것은 Java를 사용하는 일종의 어색하지만 훌륭한 솔루션입니다. 감사.
frostymarvelous

왜 ArrayList 대신 List를 사용합니까? 여기에 자바 초보자.
Sobiaholic

'List'는 추상 클래스이고 'ArrayList'는 해당 클래스의 구현 중 하나이며 동일한 추상 클래스에서 파생 된 다른 유형의 목록이 있습니다. 따라서이 때문에 ArrayList도 List입니다. 추상 클래스의 인스턴스를 만들 수 없으며 여기에서 유형으로 사용하면 인스턴스 구현을 사용해야합니다. 따라서 List는 유형이고 ArrayList는 여기서 인스턴스입니다.
veta

12

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

1
무엇 LazyMap.decorateInstantiateFactory물건을위한?
Svish

+1 다른 모든 답변은 "키"중 하나가 정수라고 가정합니다. 연관 배열이 정수가 아닌 두 개의 키 (파이썬에서 말하는 튜플)를 기반으로하면 어떻게됩니까? 인덱싱이 불가능 해짐에 따라이 방법을 사용해야한다고 생각합니다.
demongolem

10

상기 봐 인터페이스 및 콘크리트 클래스에서 의 HashMap .

지도를 만들려면

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

키-값 쌍을 추가하려면

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

키와 관련된 값을 검색하려면

assoc.get("name")

그리고 원하는 것처럼 보이는지도 배열을 만들 수 있습니다.

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

6

글쎄, 나는 또한 연관 배열을 찾고 있었고 최상의 솔루션으로 맵 목록을 찾았습니다.

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

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}

3

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


Map.containsKey () 메소드는 모든 Map 키를 반복하며, 키가 발견되면 자연스럽게 값을 리턴하는 Map.get () 메소드도 반복됩니다. 따라서 Map.get ()만이 새로운 코드를 작성하지 않고 두 가지 기술을 한 번만 수행하므로 성능이 향상됩니다. 또한 Map.get ()은 일치하는 첫 번째 키와 관련된 값을 반환 한 다음 검색을 중지합니다.이 패턴은 더 빠르고 친숙한 동작입니다. 이 게시물의 코드는 검색 키가 일치 한 후에도 모든 키를 계속 반복하며 마지막 일치 키 (첫 번째 일치 키가 아님)를 반환합니다.
Matthew

3

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}]


1

JDK 1.5 (http://tinyurl.com/3m2lxju)에는 "참고 :이 클래스는 더 이상 사용되지 않습니다. 새로운 구현에서는이 클래스를 확장하지 않고 Map 인터페이스를 구현해야합니다."라는 메모도 있습니다. 감사합니다, N.


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

예, 키로 값을 검색하려면 반복이 필요하지만 모두 필요한 경우 이것이 최선의 선택입니다.



0

그것에 대해 더 많이 생각하면서, 나는이 문제를 다루는보다 일반적인 목적으로 튜플을 버리고 싶습니다. 튜플은 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가 제공하는 클래스와 메소드를 사용하여 트리플 및 기타 고차 그룹화로 확장 될 수 있기 때문에이 접근법을 좋아합니다.


-2

PHP 주석 '아니요, PHP는 그것을 좋아하지 않을 것입니다.' 실제로, 매우 제한적인 (PHP의 경우) 예외 / 오류 수준을 설정하지 않는 한 (그리고 어쩌면 그렇지 않은 경우) PHP는 계속해서 gg 거립니다.

기본적으로 발생하는 것은 존재하지 않는 변수 / 범위를 벗어난 배열 요소에 대한 액세스는 할당중인 값을 '설정 해제'한다는 것입니다. 아니요, null이 아닙니다. PHP는 내가 이해 한 것으로부터 Perl / C 계보를 가지고 있습니다. 따라서 설정되지 않은 변수와 존재하지 않는 변수, 설정되었지만 NULL 인 값, 부울 False 값, 표준 언어가 갖는 다른 모든 변수가 있습니다. 그것들을 별도로 테스트하거나 기능 / 구문에 내장 된 올바른 평가를 선택해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.