2009-07-28 23 views
2

Ich habe eine Reihe von Arrays, die ich aus Daten zeichnen und letztlich zu einem endgültigen Array führen, das die gewünschten Informationen enthält. Das endgültige Array ist zweidimensional und besteht aus einer großen Anzahl eindimensionaler Arrays mit jeweils bis zu drei Einträgen.Mehrdimensionale Array-Manipulation - Java

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

Die Art und Weise die Array-Daten hält, ist wie folgt: Die erste „Zelle“ einen Namen hält, der zweite ein ID-Bereich und der dritte ein Vorkommen Nummer - ein int mir zu sagen, wie oft dieser Name in aufkam Diese bestimmte Regions-ID.

Nach dem Sortieren des Arrays nach Namen mit einem Bubble Sort-Algorithmus sehe ich natürlich viele Einträge, die ich nicht dort sein möchte. Stellen Sie sich zum Beispiel einen Namen vor, der 3 Mal in einer bestimmten Regions-ID erscheint. Die Art, wie die Array-Einträge für diesen Namen wie wäre aussehen würde wie folgt:

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

Was ich tun möchte, ist die überschüssigen Einträge aller wie in loszuwerden, die Einträge, die mit dem gleichen Namen und RegID entsprechen, und nur die maximale Häufigkeit für jeden Namen in einer bestimmten Region beibehalten. Also, das obige Beispiel nehmen, was ich möchte nach Manipulation des Arrays sehen wäre:

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

Irgendwelche Ideen wäre sehr dankbar, da ich ziemlich bin ratlos .. Beachten Sie, dass, da die Daten i Ich bin ziemlich groß in der Zahl, ich muss auch meinen Code effizient halten.

Antwort

2

Ich stimme Mario zu, Sie sollten hier keine Array-Struktur verwenden.Die Tatsache, dass Sie Bubble Sort verwenden, deutet darauf hin, dass Sie sich in einem Intro-Programmierkurs befinden, so dass Sie vielleicht nichts über ArrayList s, HashSet s, die .equals()-Methode oder Ähnliches wissen, aber das möchten Sie wirklich machen. Erstellen Sie ein benutzerdefiniertes Objekt mit einem benutzerdefinierten .equals() Methode - so etwas wie:

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(); 
    } 
} 

Dann können Sie eine HashMap<Record, Integer> verwenden um zu überprüfen, ob ein Datensatz bereits in der Menge vorhanden ist - wenn ja, erhöhe Zähler (der Wert der Karte) von 1 , sonst füge es hinzu.

Wenn Sie alles in einer bestimmten Reihenfolge sortiert werden sollen, können Sie entweder eine benutzerdefinierte .compareTo() Methode definieren und eine TreeMap oder verwenden, wenn Sie alles in Auftrag, verwenden Sie einen LinkedHashSet<Record> diese Ordnung zu bewahren.

+1

Vergessen Sie nicht, HashCode zu implementieren, sonst funktioniert diese Methode nicht, da das HashSet das bereits eingefügte Objekt nicht korrekt findet. Auch für so etwas würde ich eine HashMap verwenden ; Der Datensatz hat nur den Namen und die Region (und ist ansonsten wie in Ihrer Antwort), während die Ganzzahl die Anzahl ist. – jprete

+0

Danke ja, hashCode ist absolut wichtig. – dimo414

+0

Vielen Dank für die Antwort, es hat mich in die richtige Richtung geschoben. –

2

Worauf Sie wirklich achten sollten, ist die Verwendung einer ArrayList Klasse, um diese 'Elemente' zu halten.

Sie sollten auch eine bestimmte Klasse erstellen, um diese Daten zu speichern.

Ihre benutzerdefinierte Klasse sollte wie folgt aussehen:

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 
} 

Dann können Sie diese Objekte in eine ArrayList<Entry> setzen und verwenden Collections.sort(), die viel schneller als eine Blase Art sein wird.

Nachdem sie sortiert wurden, können Sie doppelte Einträge durchlaufen und entfernen, indem Sie ArrayList.remove() verwenden.

+0

Warum eine ArrayList verwenden und eine zweite Iteration durchführen, wenn Sie eine Hash-Datenstruktur verwenden können? – dimo414

+0

Nun, vielleicht will er/sie eine Art Ordnung zu den Daten haben. – jjnguy

+0

Ich weiß, dass eine Menge viele der Probleme lösen könnte, aber es hätte auch keinen Sinn für Ordnung zu den Elementen. – jjnguy

2

Eine Frage kommt in den Sinn: Warum verwenden Sie ein Array? Ich würde denken, dass es besser ist, ein Set-Objekt zu verwenden, um Ihre Ergebnisse zu halten, und dann ein Result-Objekt zu erstellen, das drei Felder hat: eins für Name, eins für Region und eins für die Zählung. Wenn die equals- und hash-Methoden überschrieben werden, um nur die Region und den Namen zu berücksichtigen, haben Sie keine Duplikate in Ihrem Satz und können diese verwenden, um diese Ergebnisobjekte zu verfolgen.

Eine andere Möglichkeit, dasselbe zu erreichen, ist eine Map, wobei der Schlüssel der Name + Region ist und der Wert die Anzahl ist. Dies würde auch die Implementierung vereinfachen und sicherstellen, dass Sie keine Duplikate haben.

0

Sounds wie eine Hashtable oder Map könnte nützlich sein. Sie können die Rohdaten nur einmal durchgehen und die Karte verwenden, um den Namen nachzuschlagen. Fügen Sie ihn hinzu, falls er noch nicht angezeigt wird, oder prüfen Sie, ob der Wert durch den neuen Eintrag überschritten wurde, falls dies der Fall ist. Dies würde keine vorherige Sortierung erfordern. Sie könnten danach sortieren und viel Zeit sparen :-)

+1

Obwohl nicht technisch veraltet, Sie Hashtable nicht verwenden möchten, wenn Sie es helfen können, HashMap ist die richtige Verwendung. – dimo414