HashMap 계수 최적화
2466 단어 java 학습 노트
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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
자바 프로그래밍 사상 읽기 노트 (1)단일 계승 구조: 모든 대상에 하나의 기본 Object가 있는데 이런 장점은 모든 대상이 기본 유형의 정보를 가지고 있기 때문에 대상의 유형을 확정할 수 없어 교착 상태에 빠지지 않는다는 것이다.이것은 시스템 수준의...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.