HashMap 계수 최적화

2466 단어 java 학습 노트
데이터베이스나 텍스트에서 특정 내용이 나타나는 빈도를 HashMap으로 계산하는 경우가 많을 수 있습니다. 이 글은 세 가지 HashMap 계수기의 실현 방법을 비교한 것으로 참고할 수 있습니다.
1. 가장 기초적인 실현 방식을 먼저 소개하고 코드는 다음과 같다.
String s = "one two three two three three";
String[] sArr = s.split(" ");
 
//naive approach	 
HashMap counter = new HashMap();
 
for (String a : sArr) {
	if (counter.containsKey(a)) {
		int oldValue = counter.get(a);
		counter.put(a, oldValue + 1);
	} else {
		counter.put(a, 1);
	}
}

이러한 실현 방법에서 매번 순환할 때마다 키의 존재 여부를 검사해야 한다. 첫 번째 출현을 나타내지 않고 대응하는value값을 1로 설정하고 존재하면value값에 1을 추가한다.이런 방법은 간단하고 직관적이지만, 이것은 결코 좋은 실현 방식이 아니다. 왜냐하면 다음과 같은 두 가지 상황이 초래하는 효율이 높지 않은 문제를 고려하지 않았기 때문이다.
1, 1 Key가 존재할 때 방법containsKey()와 방법get()은 맵을 두 번 순환합니다
1,2 Integer 유형은 변할 수 없기 때문에value 값에 1을 추가할 때마다 새로운 Integer 대상을 생성합니다
2. 비교적 좋은 실현 방식으로 상술한 Integer 유형이 변할 수 없는 문제를 해결했다
많은 Integer 객체를 만들지 않으려면 다음과 같은 클래스 코드를 구현하는 가변 Integer가 필요합니다.
class MutableInteger {
 
	private int val;
 
	public MutableInteger(int val) {
		this.val = val;
	}
 
	public int get() {
		return val;
	}
 
	public void set(int val) {
		this.val = val;
	}
 
	//used to print value convinently
	public String toString(){
		return Integer.toString(val);
	}
}

이렇게 하면 우리의 코드는 다음과 같이 최적화될 수 있다.
HashMap newCounter = new HashMap();	
 
for (String a : sArr) {
	if (newCounter.containsKey(a)) {
		MutableInteger oldValue = newCounter.get(a);
		oldValue.set(oldValue.get() + 1);
	} else {
		newCounter.put(a, new MutableInteger(1));
	}
}

더 많은 Integer 대상을 만들 필요가 없기 때문에 첫 번째 방법보다 낫지만 키가 존재할 때 두 번 반복됩니다.그래서 우리는 한층 더 최적화를 해야 한다.
3. 가장 효과적인 실현 방식
HashMap efficientCounter = new HashMap();
 
for (String a : sArr) {
	MutableInteger initValue = new MutableInteger(1);
	MutableInteger oldValue = efficientCounter.put(a, initValue);
 
	if(oldValue != null){
		initValue.set(oldValue.get() + 1);
	}
}

해시맵 때문에.put(key,value) 이 방법은 키의 현재 값, 즉 현재 키에 대응하는value를 되돌려줍니다. 따라서 우리는value의 인덱스를 이용하여 1조작을 할 수 있습니다. 한 번에 해결할 수 있습니다. 낭비 성능을 찾을 필요가 없습니다!
텍스트 링크:http://iyuze.cn/blog/56.html

좋은 웹페이지 즐겨찾기