Program Tip

Hashmap은 int, char에서 작동하지 않습니다.

programtip 2020. 11. 23. 19:55
반응형

Hashmap은 int, char에서 작동하지 않습니다.


중복 가능성 :
Java 컬렉션에 기본 값 저장?

Java에서 다음을 사용할 때 :-

public HashMap<char, int> buildMap(String letters)
{
    HashMap<char, int> checkSum = new HashMap<char, int>();

    for ( int i = 0; i < letters.length(); ++i )
    {
        checkSum.put(letters.charAt(i), primes[i]);
    }

    return checkSum;
}

부적절한 유형과 관련된 오류가 발생합니다. char 및 int 대신 Character 및 Integer를 사용하여 문제를 해결했습니다. 그러나 HashMap이 원시 데이터 유형을 처리하지 못하는 이유를 파악하는 데 어려움이 있습니다.


일반 매개 변수는 기본 유형이 아닌 참조 유형에만 바인딩 할 수 있으므로 해당하는 랩퍼 유형을 사용해야합니다. HashMap<Character, Integer>대신 시도하십시오 .

그러나 HashMap이 원시 데이터 유형을 처리하지 못하는 이유를 파악하는 데 어려움이 있습니다.

이것은 유형 삭제 때문 입니다. Java에는 처음부터 제네릭이 없었으므로 a HashMap<Character, Integer>는 실제로 HashMap<Object, Object>. 컴파일러는 잘못된 유형의 값을 입력하거나 잘못된 유형을 가져 오지 않도록 여러 추가 검사 및 암시 적 캐스트를 수행하지만 런타임에는 HashMap클래스 가 하나만 있고 객체를 저장합니다.

다른 언어는 유형을 "특수화"하므로 C ++에서 a vector<bool>vector<my_class>내부적으로와 매우 다르며 공통 vector<?>수퍼 유형 을 공유하지 않습니다 . Java는 사전 제네릭 코드와의 하위 호환성에 관계없이 a List<T> a 되도록 정의 합니다. 제네릭 유형의 모든 매개 변수화에 대해 단일 구현 클래스가 있어야한다는이 이전 버전과의 호환성 요구 사항은 제네릭 매개 변수가 프리미티브에 바인드 할 수있는 템플릿 전문화 유형을 방지합니다.ListT


제네릭은 키워드 형태로 기본 유형을 사용할 수 없습니다.

사용하다

public HashMap<Character, Integer> buildMap(String letters)
{
    HashMap<Character, Integer> checkSum = new HashMap<Character, Integer>();

    for ( int i = 0; i < letters.length(); ++i )
    {
        checkSum.put(letters.charAt(i), primes[i]);
    }

    return checkSum;
}

업데이트 됨 : Java 7 이상에서는 다이아몬드 연산자를 사용할 수 있습니다.

HashMap<Character, Integer> checkSum = new HashMap<>();

제네릭은 기본이 아닌 객체 유형 만 지원합니다. C ++ 템플릿과 달리 제네릭은 코드 생성을 포함하지 않으며 사용하는 제네릭 유형의 수에 관계없이 HashMap 코드가 하나만 있습니다.

Trove4J 는 프리미티브를 사용하기 위해 선택된 컬렉션을 미리 생성 하여이Map<Character, Integer> 문제를 해결하고 필요한 경우 지원하기 위해 래핑 할 수있는 TCharIntHashMap 을 지원합니다 .

TCharIntHashMap : char 키 및 int 값에 대한 개방형 주소 맵 구현입니다.


HashMaps을 경우에만 사용할 수 있습니다 classes, 없습니다 primitives. programmerinterview.com 의이 페이지 는 답을 찾는 데 도움이 될 수 있습니다. 솔직히이 문제에 대한 답을 직접 찾지 못했습니다.


기본 유형을 콜렉션에 넣을 수 없습니다. 그러나 해당 개체 래퍼를 사용하여 선언 할 수 있으며 권투가 허용하는 한 여전히 기본 값을 추가 할 수 있습니다.


Generic Collection 클래스는 프리미티브와 함께 사용할 수 없습니다. 대신 Character 및 Integer 래퍼 클래스를 사용하십시오.

Map<Character , Integer > checkSum = new HashMap<Character, Integer>();


GenericsWrapper클래스 만 사용하여 정의 할 수 있습니다 . Wrapper 유형을 사용하여 정의하지 않으려면 아래와 같이 Raw 정의를 사용할 수 있습니다.

@SuppressWarnings("rawtypes")
public HashMap buildMap(String letters)
{
    HashMap checkSum = new HashMap();

    for ( int i = 0; i < letters.length(); ++i )
    {
       checkSum.put(letters.charAt(i), primes[i]);
    }
    return checkSum;
}

또는 랩퍼 유형을 사용하여 HashMap을 정의하고 기본 유형을 저장하십시오. 기본 값은 래퍼 유형으로 승격됩니다.

public HashMap<Character, Integer> buildMap(String letters)
{
  HashMap<Character, Integer> checkSum = new HashMap<Character, Integer>();

  for ( int i = 0; i < letters.length(); ++i )
  {
    checkSum.put(letters.charAt(i), primes[i]);
  }
  return checkSum;
}

참고 URL : https://stackoverflow.com/questions/13216314/hashmap-does-not-work-with-int-char

반응형