2009-07-28 17 views
2

私はデータを描画し、最終的には必要な情報を保持する最終配列につながる一連の配列を持っています。最後の配列は2次元であり、それぞれが最大3つのエントリを保持する多数の1次元配列から構成されています。この名前はで思い付いた何回私に言ってint型 - 最初の「セル」の名前を保持して、地域のIDと第三出現数秒:多次元配列操作 - Java

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

次のように配列でデータを保持している方法ですこの特定の地域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 
... 

任意のアイデアをいただければ幸いことに注意してくださいデータI以来、私のコードを効率的に保つ必要があります。

答えて

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、カウント(マップの値)をインクリメントしない場合それ以外の場合は追加します。

あなたが特定の順序でソートすべてをしたい場合は、カスタム.compareTo()メソッドを定義し、TreeMapまたは、あなたが挿入順にすべてをしたい場合は、その順序を維持するためにLinkedHashSet<Record>を使用を使用することができます。

+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を使用し、ある種のハッシュデータ構造を使用することができる場合、2番目の繰り返しがあるのですか? – dimo414

+0

さて、おそらく、彼はデータに何らかの並べ替えをしたいと思っています。 – jjnguy

+0

私は、セットが多くの問題を解決することができることを知っていますが、要素に順序感がないこともあります。 – jjnguy

2

質問があります。なぜあなたは配列を使用していますか? Setオブジェクトを使用して結果を保持し、Name、Region、Countの3つのフィールドを持つResultオブジェクトを作成する方がよいと思います。 equalsメソッドとhashメソッドをオーバーライドしてリージョンと名前のみを考慮すると、セットに重複がなくなり、これらの結果オブジェクトを追跡するために使用できます。

同じことを達成する別の方法は、キーが名前+領域で値がカウントであるマップを持つことです。これにより、実装が簡単になり、重複がないことが保証されます。

0

ハッシュテーブルやマップのようなサウンドが便利かもしれません。未処理のデータを1回通過させ、名前を参照したり、まだ表示されていない場合は追加したり、新しいエントリが値を超過していないかどうかを確認するためにマップを使用できます。これは、事前にソートする必要はありません。後でソートして時間を節約することができます:-)

+1

技術的に廃止されているわけではありませんが、Hashtableを使用したくない場合は、HashMapが正しい使用法です。 – dimo414