2009-07-28 10 views
2

나는 데이터를 추출하여 궁극적으로 내가 원하는 정보를 보유하고있는 최종 배열로 이어지는 일련의 배열을 가지고있다. 최종 배열은 2 차원이며, 각각 최대 3 개의 항목을 보유하는 많은 수의 단일 차원 배열로 구성됩니다. 다음과 같이 배열 데이터를 보유다차원 배열 조작 - Java

int[][] realOcc = new int[result.length][3]; 

방법은 다음과 같습니다 첫 번째 "셀"의 이름을 보유하고, 선두로부터 번호 지역의 ID 두 번째와 세 번째 -이 이름에 와서 몇 번이나 말해 int로 이 특정 지역 ID.

버블 정렬 알고리즘을 사용하여 이름에 따라 배열을 정렬 한 후에 자연스럽게 많은 항목을 볼 수 있습니다. 예를 들어, 특정 지역 ID에 3 번 이름이 올 것이라고 상상해보십시오. 다음과 같이 이름에 대한 배열 항목의 모습 방법은 다음과 같습니다

전에서 모든 초과 항목이 제거되어 수행 할 작업을
Name1 regionID17 1 
Name1 regionID17 2 
Name1 regionID17 3 
... 
Name156 regionID1 1 
Name168 regionID99 1 
... 

, 동일한 이름과 REGID에 해당하는 항목, 특정 지역의 각 이름에 대해 최대 발생 숫자 만 유지하십시오. 따라서, 위의 예를 복용, 어떻게 내가 될 배열을 조작 한 후보고 싶다 .. 나는 꽤 많은 난처한 상황에 빠진거야 이후

Name1 regionID17 3 
... 
Name156 regionID1 1 
Name168 regionID99 1 
... 

어떤 아이디어가 크게 감상 할 수 있음을 명심 데이터 난 이후 당기는 수는 꽤 많고 코드를 효율적으로 유지해야합니다.

답변

2

Mario에 동의합니다. 여기서는 배열 구조를 사용하지 말아야합니다.Bubble Sort를 사용하고 있다는 사실은 사용자가 어떤 종류의 인트로 프로그래밍 과정에있는 것이므로 ArrayList s, HashSet s, .equals() 메서드 등을 알지 못할 수도 있지만 실제로 원하는 것입니다. 해야 할 것. 사용자 정의 .equals() 방법으로 사용자 정의 객체를 생성 - 같은 :

public class Record{ 
    String name; 
    String region; 

    public boolean equals(Object o){ 
    Record r = (Record)o; 
    return name.equals(r.name) && region.equals(r.region); 
    } 

    public int hashCode(){ 
    return name.hashCode()+region.hashCode(); 
    } 
} 

는 그런 다음 레코드가 이미 세트에 존재하는지 확인하는 HashMap<Record, Integer>을 사용할 수 있습니다 - 그것은 1, 증가 수 (지도의 값)을 수행하는 경우 , 그렇지 않으면 추가하십시오. 당신이 특정 순서로 정렬 모두를 원하는 경우에 당신이 삽입 순서로 모든 것을 원하는 경우

, 그 순서를 유지하기 위해 LinkedHashSet<Record>를 사용하여, 사용자 정의 .compareTo() 방법을 정의하고 TreeMap를 사용하거나 할 수 있습니다.

+1

hashCode를 구현하는 것을 잊지 마십시오. 그렇지 않으면 HashSet이 이미 삽입 된 객체를 제대로 찾지 못하기 때문에이 메서드는 작동하지 않습니다. 또한 이와 같은 경우 HashMap 를 사용합니다. 그 레코드는 이름과 지역만을 가지고 있습니다 (그리고 당신의 대답과 같음). 정수는 카운트입니다. – jprete

+0

네, hashCode가 절대적으로 중요합니다. – dimo414

+0

답변을 주셔서 감사합니다. 올바른 방향으로 나를 밀어 붙였습니다. –

2

실제로 살펴 봐야 할 것은 ArrayList 클래스를 사용하여 이러한 '항목'을 보관하는 것입니다.

또한이 데이터를 보관할 특정 클래스를 만들어야합니다.

사용자 정의 클래스는 다음과 같이 보일 것이다 :

class Entry implements Comparable<Entry> { 
    private String name, region; 
    private int occuranceCount; 

    public Entry(String nameP, regionP, occurCountP){ 
     name = nameP; 
     region = regionP; 
     occuranceCount = occurCountP; 
    } 

    // Getters 

    public int compareTo(Entry other){ 
     return name.compareTo(other.name); 
    } 

    // Equals and hashcode 
} 

그런 다음 당신은 ArrayList<Entry>에 이러한 개체를 넣어 거품 정렬보다 훨씬 빠를 것이다 Collections.sort()를 사용할 수 있습니다.

정렬 후에는 ArrayList.remove()을 사용하여 중복 된 항목을 반복하여 제거 할 수 있습니다.

+0

왜 ArrayList를 사용하고 어떤 종류의 해시 데이터 구조를 사용할 수있을 때 두 번째 반복이 있습니까? – dimo414

+0

글쎄, 아마 그/그녀는 데이터에 어떤 종류의 질서를 갖기를 원할 것입니다. – jjnguy

+0

세트가 여러 가지 문제를 해결할 수 있음을 알고 있지만 요소에 질서 정연하지 않습니다. – jjnguy

2

질문 : 왜 배열을 사용하고 있습니까? Set 객체를 사용하여 결과를 저장 한 다음 Name, Region 및 Count에 대해 세 개의 필드가있는 Result 객체를 만드는 것이 더 좋습니다. 지역 및 이름만을 고려하여 equals 및 hash 메소드를 재정의하면 세트에 중복 항목이 없으며이를 사용하여 결과 객체를 추적 할 수 있습니다.

동일한 방법으로 달성하는 또 다른 방법은지도가있는 것입니다. 여기서 키는 이름 + 지역이며 값은 개수입니다. 이렇게하면 구현이 간단 해지고 중복되지 않도록 할 수 있습니다.

0

해시 테이블이나지도 같은 소리가 유용 할 수 있습니다. 원시 데이터를 한 번 통과시켜 맵을 사용하여 이름을 조회하거나, 아직 보지 못하면 추가하거나, 새 항목에 의해 값이 초과되었는지 확인하십시오. 미리 정렬 할 필요가 없습니다. 나중에 정렬하여 많은 시간을 절약 할 수 있습니다 :-)

+1

기술적으로 더 이상 사용되지 않지만 Hashtable을 사용하는 것을 원하지 않는다면 HashMap이 올바른 사용법입니다. – dimo414