문제
Java에서 해시 테이블(또는 연관 배열...)을 생성하는 가장 간단한 방법은 무엇입니까?내 google-fu에서 몇 가지 예를 찾았지만 이를 수행하는 표준 방법이 있습니까?
그리고 각 쌍의 개체에 대해 add 메서드를 개별적으로 호출하지 않고 키->값 쌍 목록으로 테이블을 채울 수 있는 방법이 있습니까?
해결책
Map map = new HashMap();
Hashtable ht = new Hashtable();
두 수업 모두 java.util 패키지에서 찾을 수 있습니다. 두 가지의 차이는 다음에 설명되어 있습니다. JGURU FAQ 항목.
다른 팁
이중 중괄호를 사용하여 데이터를 설정할 수 있습니다.여전히 add 또는 put을 호출하지만 덜 보기 흉합니다.
private static final Hashtable<String,Integer> MYHASH = new Hashtable<String,Integer>() {{
put("foo", 1);
put("bar", 256);
put("data", 3);
put("moredata", 27);
put("hello", 32);
put("world", 65536);
}};
또한 맵과 해시 테이블은 모두 Java 5 이상에서 일반적이라는 것을 잊지 마십시오 (다른 클래스와 마찬가지로 수집 프레임 워크).
Map<String, Integer> numbers = new HashMap<String, Integer>();
numbers.put("one", 1);
numbers.put("two", 2);
numbers.put("three", 3);
Integer one = numbers.get("one");
Assert.assertEquals(1, one);
import java.util.HashMap;
Map map = new HashMap();
뭐 에드먼드 말했다.
항상 .add를 부르지 않는 것은 관용적으로 아닙니다. 당신이 정말로 원한다면 할 수있는 다양한 해킹 (배열에 저장 한 다음 루핑)이 있지만 권장하지는 않습니다.
그리고 각 쌍의 개체에 대한 추가 메소드를 개별적으로 호출하지 않고 키-> 값 쌍의 목록으로 테이블을 채우는 방법이 있습니까?
질문의 한 가지 문제는 데이터가 어떤 형태로 시작되는지 언급하지 않는다는 것입니다. 쌍 목록이 맵 목록이 된 경우, 객체 객체는 매우 쉽습니다.
이것을 버리기 위해 hashtable의 확장 인 java.util.properties라는 (많은 악성) 클래스가 있습니다. 문자열 키와 값 만 기대하며 파일 또는 스트림을 사용하여 데이터를로드하고 저장할 수 있습니다. 읽는 파일의 형식은 다음과 같습니다.
key1=value1
key2=value2
이것이 당신이 찾고있는 것인지 모르겠지만 이것이 유용 할 수있는 상황이 있습니다.
Java의 해시 함수는 최적보다 적습니다. 충돌을 줄이고 ~ 50% 용량으로 다시 호출을 거의 완전히 제거하려면 Buz Hash 알고리즘을 사용하겠습니다. Buz Hash
Java의 해싱 알고리즘이 약한 이유는 해시를 어떻게 해시하는지에서 가장 분명합니다.
"a".hash()
ASCII 표현을 제공하십시오 "a"
- 97
, 그래서 "b"
할 것입니다 98
. 해싱의 요점은 임의의 "가능한 한 무작위"숫자를 할당하는 것입니다.
빠르고 더러운 해시 테이블이 필요한 경우 꼭 사용하십시오. java.util
. 더 확장 가능한 강력한 것을 찾고 있다면, 나는 당신 자신의 구현을 살펴볼 것입니다.
Hashtable<Object, Double> hashTable = new Hashtable<>();
값을 넣으십시오 ...
최대를 얻으십시오
Optional<Double> optionalMax = hashTable.values().stream().max(Comparator.naturalOrder());
if (optionalMax.isPresent())
System.out.println(optionalMax.get());