2011-12-26 5 views
1

모든 필드에 특정 유형이있는 필드 모음이있는 객체를 만들어야합니다. (필드 수와 유형이 다양 함) 유형이 "일반"문자열, 날짜, 길이, 인치, 부울동적 유형 필드가있는 객체

캐스팅을 피하기 위해 값을 유형으로 저장하려고합니다.

이제 값이 객체 인 경우 Hashmap (비 제너릭)을 사용합니다.

하지만 해시 맵이 느리고 무겁습니다 (많은 것을 사용합니다).

어떻게해야합니까?

해시 맵은 모든 열의 형식이있는 테이블의 행 구조를 나타냅니다. 나는이
http://javolution.org/target/site/apidocs/javolution/util/FastMap.html

+2

게시물을 수정하십시오. 제 의견으로는 당신이 무엇을하려고하는지 명확하지 않습니다. 특히 사용되는 데이터 유형 및 이유는 무엇입니까? – fuzzy

+0

퍼지, 해시 맵은 모든 열의 형식이있는 테이블 행 구조를 나타냅니다. 그 값을 열 유형으로 저장하고 싶습니다. – simpleuser

+0

내가 말했듯이, 귀하의 게시물을 편집하십시오. 여전히 (문법적으로) 올바르지 않으며 서식도 향상 될 수 있습니다. 몇 가지 추가 정보를 추가하거나 상황을 다르게 설명하십시오. – fuzzy

답변

0

의 유형으로 값을 저장합니다.

HashMap 데이터 구조는 O(1)입니다. 왜 그들이 당신이 "느리고 무겁다"고 생각하는지 잘 모르겠다. 다른 데이터 구조가 더 적합 할 수있는 곳에서 과용하는 것처럼 들립니다.

2

당신은 Java Generics에 읽어해야 볼 수있는 열

+0

내가하는 일은 해시 맵 하나에서 다른 해시 맵 (해시 맵의 컬렉션)까지 많은 "심층적 인"복사입니다. 그 때문에 나는 매번 모든 값을 반복하여 다른 해시맵에 넣어야합니다. – simpleuser

1

클래스의 필드에 동적으로 액세스하려는 경우 리플렉션 또는 Apache BeanUtils 클래스 (Java Bean을 Map for YOU로 변환 할 수 있음)를 사용하는 것은 관용적입니다.)는지도에서 객체를 단순히 인코딩합니다.

당신이 정말로 묻는 것처럼 들리네. 어떻게 동적으로 인코딩 된 데이터를 일반적으로 처리 할 수 ​​있습니까? 이것은 java에서 일반적인 작업입니다. 우리는 일반적으로 변수에서 정확한 데이터 유형을 인코딩하지 않으므로 내성이 필요합니다. 인트로 스펙 션을 사용하면 코드 기반을 매우 쉽게 일반화 할 수 있습니다.

당신은 큰 객체가 맵에 간단한 이름/값 튜플을 설정 인코딩하려면

각 맵은 여러 분야와 객체를 인코딩 큰 "지도 목록"을 생성하는 솔루션입니다 유효한. 종종 데이터 모델을 프로토 타이핑하거나 데이터 모델을 만들기 전에 XML 또는 JSON 객체로 가득 찬 파일을 파싱하는 첫 번째 실행을 위해이 작업이 수행됩니다. ,

List<HashMap<String,Object>> my objects = new ArrayList<HashMap<String,Object>>(); 
HashMap<String,Object> h = new HashMap<String,Object)(); 
h.put("SSN",new Integer(2224441234)); 
h.put("username","jayunit100"); 
myObjects.add(h); 

//Now, you can easily identify String vs integer values using introspection : 
HashMap<String,Object> h = myObjects.get(0); 
//You will need to iterate through the entries of the map as follows, 
//And use intropection to process each type as you see fit. 
for(Entry e : h.entries) 
{ 
    Object o = e.getValue(); 
    if(o instanceof Integer) 
     System.out.println(e.getName() + " was an int! that was easy !"); 
    else 
     System.out.println(e.getName() + " was another (non int) type : " + o.getClass().getName()); 
} 

를 따라서 : 어떤 경우에, 당신은 오히려 올바른 유형으로 객체를 저장 확인한 후 쉽게 대신 형식 유추를 사용할 수 있습니다, 자신의 유형에 따라에 "이름"개체가 필요하지 않습니다 우리는 맵에서 임의의 속성의 유형을 반드시 어떤 식 으로든 인코딩하지 않고도 임의의 속성을 사용하여 대규모의 개체 컬렉션을 쉽게 만들 수 있습니다. 그런 다음 java의 인트로 스펙 션을 사용하여 런타임에 유형을 판별 할 수 있습니다. 당신이 변수 이름과 필드 형식 특정 코드 할 필요가 없도록, 동적으로 필드를 액세스 할 경우 큰 개체 colletions를 데이터베이스 쿼리를 구축하거나 디버깅 할 때

이것은 예를 들어, 일반적인 . 이러한 작업은 필드/값을 간단한 형식의 텍스트로 이름 값 쌍으로 나열해야하는 경우가 많습니다.이를 위해 맵 대신 객체로 유형을 저장하고 Apache BeanUtils 라이브러리를 사용하여 객체를 맵으로 변환하거나 BeanUtils.describe의 항목을 반복하여 모든 필드에서 작업을 수행 할 것을 제안합니다. myObject) 메서드를 호출합니다.

당신이 큰 작업

당신은 대규모 배열에 저장하고 최적화/데이터를 인코딩 할 수의 유형에 매우 빠르게 액세스합니다. 이것은 극도로 계산 집약적 인 I/O 또는 계산을 수행하지 않는 한 나쁜 생각입니다.

최종 참고 사항 : 내용을 분석/인쇄/출력 할 때 키/값 쌍이 동일한 순서로 나오도록 HashMaps 대신 TreeMaps를 사용하는 것이 좋습니다.

0

오히려 해시 맵에서 객체의 종류마다를 저장하는 대신, 당신이 할 수있는 일은 지수는 1) 일반으로 긴
2) 문자열
3) 날짜
4)를 사용하고자하는 모든 유형입니다
이러한 것들이 10보다 작은 목록이므로 types라는 arrayList에 저장하고 객체를 얻을 때마다 IndexOf

을 사용하여 위의 유형의 색인을 확인하고 각 유형에 대한 객체를 ArrayList의 배열

ArrayList [] myobjects;

및 ArrayList를 읽는 동안 U 적절한 타입 캐스팅, 캐릭터 오브젝트를 저장 myobjects [3] .add() 에 넣고 싶은 경우.

여기서 myobjects [0] ---> 모든 일반 개체를 저장합니다. myobjects [1] -----> 모든 String 개체를 저장하는 식으로 계속됩니다.

이렇게하면 모든 String 객체를 일반 객체와 차별화 할 수 있고 안전한 방법으로 문자를 형변환 할 수 있습니다.

0

HashMaps를 사용하는 유일한 대안은 바이트 코드를 사용하여 생성 된 데이터 형식을 사용하는 것입니다. 안타깝게도 많은 작업이 있지만 2-3 배 작고 빨라질 수 있습니다. 그러나 이것이 필요한 경우 필자는 필요한 필드의 수퍼 유형이어야한다고 할지라도 구체적인 유형을 다시 고려할 것을 제안합니다.