2010-05-12 9 views
8

Ist es möglich, ein Array zu haben, das zwei verschiedene Arten von Daten enthält? Ich möchte ein Array, das ein Double und auch eine Zeichenfolge enthält. Ich versuchte:Arrays verschiedener Typen

ArrayList<double><String> array; 

Aber das hat nicht funktioniert.

Sorry für die dumme Frage, aber es ist eine Weile her, seit ich so etwas verwendet habe .. Kannst du mein Gedächtnis auffrischen, wie würde ich ein solches Array deklarieren und auffüllen?

Und um es noch einen Schritt weiter zu machen, würde ich gerne das Array nach dem Double sortieren, wenn möglich?

Danke!

+1

Nein, das ist nicht möglich. Was genau versuchst du zu tun? Vielleicht können wir Ihnen helfen, einen Workaround zu finden. –

Antwort

14

Erstens verwenden, ist es wert zwischen einem Array klar über den Unterschied, und ein ArrayList - sie überhaupt nicht dasselbe sind.

In beiden Fällen können Sie jedoch nicht tun, was Sie wollen. Der nächstgelegene Ort, an den Sie wahrscheinlich kommen können, ist, Ihren eigenen Typ zu deklarieren. (BEARBEITEN: Mein ursprünglicher Code hatte eine doppelte oder eine Zeichenfolge ... Ich habe es jetzt geändert, um eine doppelte und eine Zeichenfolge zu sein. Lassen Sie mich wissen, wenn diese Änderung ist nicht was Sie im Sinn hatten.)

public final class DoubleAndString 
{ 
    private final String stringValue; 
    private final double doubleValue; 

    public DoubleAndString(String stringValue, double doubleValue) 
    { 
     this.stringValue = stringValue; 
     this.doubleValue = doubleValue; 
    } 

    public String getString() 
    { 
     return stringValue; 
    } 

    public String getDouble() 
    { 
     return doubleValue; 
    } 
} 

Dann wird ein ArrayList<DoubleAndString> oder ein DoubleAndString[] erstellen.

Nun fühlt sich das im Moment etwas an, vermutlich haben die Doppel- und String-Werte tatsächlich eine größere Bedeutung - zum Beispiel einen Namen und eine Punktzahl. Wenn ja, kapseln Sie das in einem Typ ein, der die Paarung passender beschreibt.

Wie für die Bestellung - Sie könnteDoubleAndStringComparable<DoubleAndString> machen implementieren - aber es sei denn, das ist der nur natürliche Ordnung, die Sinn macht, würde ich schreiben ein Comparator<DoubleAndString>:

public class DoubleComparator implements Comparator<DoubleAndString> 
{ 
    public int compare(DoubleAndString ds1, DoubleAndString ds2) 
    { 
     return Double.compare(ds1.getDouble(), ds2.getDouble()); 
    } 
} 

Dann können Sie Collections.sort verwenden, um Sortiere ein ArrayList<DoubleAndString> oder Arrays.sort, um ein Array zu sortieren.

+0

+1, beat'd. Das sollte mein Vorschlags- und benutzerdefinierter Datentyp sein. – Robb

2

Es klingt wie Sie eine Karte wollen. Da Sie die Map sortieren möchten, kann eine TreeMap optimal sein.

Map<Double, String> myMap = new TreeMap<Double, String>(); 

Karten sind assoziativ. Jedem Double ist eine Zeichenfolge zugeordnet. Wenn Sie mehrere Strings pro Doppel wollen, können Sie eine

Map<Double, ArrayList<String>> 
1

Was möchten Sie tun?

Wenn es sich nicht um eine Schlüsselwertzuordnung handelt, sollten Sie eine neue Klasse dafür erstellen.

2

Nun, wenn Sie ein Array mit einer beliebigen Anzahl von Elementen haben wollen, dann müssen Sie einfach einen Typ verwenden, der ein gemeinsamer Vorfahre für beide ist. In diesem Fall wäre das Object (da String und Double beide von Object erben). Dies erfordert jedoch, dass Sie die Typen überprüfen, wenn Sie sie abrufen oder verwenden.

Wenn Sie eine feste Anzahl von mehreren verschiedenen Typen verwenden, dann ist das, was Sie wirklich wollen, ein "Tupel". Java verfügt derzeit jedoch nicht über eine Implementierung von Tuple verfügbar. Für zwei Elemente:

public class Pair<T1,T2> 
{ 
    public Pair(){ 
      this(null,null); 
    } 

    public Pair(T1 x1){ 
      this(x1,null); 
    } 

    public Pair(T1 x1, T2 x2){ 
     _x1 = x1; 
     _x2 = x2; 
    } 

    public T1 getFirst(){ 
     return _x1; 
    } 

    public T1 getSecond(){ 
     return _x2; 
    } 

    private T1 _x1; 
    private T2 _x2; 
} 
2

können Sie nur ArrayList<object> arraylist tun und dann kann man alles in sie, aber das kann nicht sein, was Sie wollen.

Dann, um zu sortieren, würden Sie nur Ihre eigenen Komparator verwenden, aber, wie Theatrus erwähnt, sollen diese beiden Werte verbunden sein, oder haben Sie ein Single-Dimension-Array mit zwei verschiedenen Datentypen?

5

Sie können ArrayList<Object> verwenden und Sie können dann alles verwenden, was Sie möchten. Verkapseln Sie die double in einem Double Objekt und wenn Sie das Objekt abrufen, verwenden Sie instanceof, um zu überprüfen, ob es wirklich eine double oder eine String ist.

Ich muss sagen, es ist unwahrscheinlich, dass dieses "Design" Sie irgendwelche Auszeichnungen gewinnen würde. Ist es möglich, die Lösung, die Sie für Ihr Problem in Betracht ziehen, zu überdenken und zu prüfen, ob Sie mit einer anderen Herangehensweise umgehen könnten?

3

Sie wissen das vielleicht schon, aber es ist sicherlich keine gute Idee, verschiedene Typen in einer Liste zu speichern. Definitionsgemäß ist ein Array eine Sammlung von ähnlichen Objekten und die Füllung aller Arten darin macht die Dinge unscharf. Sie würden also lieber einen separaten Typ haben, um diese verschiedenen Werte zu halten.

2

Eine ArrayList enthält definitionsgemäß nur ein Objekt pro Position. Man könnte so etwas tun:

List<MyTuple> list = new ArrayList<MyTuple>(); 

public static class MyTuple implements Comparable<MyTuple> { 

    private Double doubleValue; 
    private String stringValue; 

    //getters and setters 

    public int compareTo(MyTuple tuple) { 
     return doubleValue.compareTo(tuple.getDoubleValue()); 
    } 
} 

Sie können dann die Collections.sort() -Methode durch die Doubles zu sortieren.

0

Sie können sich die Basisklasse Number ansehen.

List<Number> list = new ArrayList<Number>(); 
list.add(new Integer(3)); 
list.add(new Double(5.2)); 

Sie können die Zahlen als Strings interpretieren, Number mit:

NumberFormat formatter = new DecimalFormat("#.##"); 
String s = formatter.format(list.get(0)); 

Obwohl dies nicht sein kann, was Sie wollen, Sie sind ein wenig kurz auf Details zu Ihrem Endziel.

0

wenn Sie versuchen, im Grunde keine Vergleiche zu tun/auf der Arraylist Sortierung dann könnte man etwas wie unten erstellen:

Liste list = new Arraylist();

sonst .. Jon Skeet Antwort war der beste Ansatz.

Verwandte Themen