2013-10-26 5 views
6

Ist es möglich, zwei Arrays (eindimensional), die Zeichenfolge und int ist und sie zu sortieren? zum Beispiel:Verknüpfen oder verschmelzen 2 Arrays zu 1 und sortieren sie in Java

String name[] = {"Percy", "Daniel, "Layla"}; 
int marks[] = {90, 87, 91}; 

Arrays.sort (name); 
for(int i = 0; i < name.length; i++) 
    System.out.println((i+1) + ". "+ name[i] + "\t\t" + marks[i]); 

, wenn ich sie sortieren möchte, wollte ich die Ausgabe wie folgt sein:

// before sorting 
1. Percy  90 
2. Daniel  87 
3. Layla  91 

// after sorting 
1. Daniel  90 
2. Layla  87 
3. Percy  91 

// the actual output that i wanted 
1. Daniel  87 
2. Layla  91 
3. Percy  90 

Was würden Sie mir empfehlen, zu tun? Wie verknüpfe ich diese 2 Arrays und sortiere sie nach ihren Namen? Oder wie füge ich sie zusammen? Gibt es eine einfache Methode, die ich verstehen kann? Wie ich überall im Netz gelesen habe auf Komparatoren, merge und alles, aber ich bin nicht so klar darauf.

Ich bin neu in Java. Gibt es irgendeine Methode für Anfänger?

+2

Nachschlagen 'HashMap's. – Doorknob

Antwort

0

Dies ist, was ich tat, in der Regel, wenn ich ein Neuling war :

 String name[] = {"Percy","Daniel","Layla"}; 
     int marks[] = {90, 87, 91}; 
     String merged[] = new String[name.length]; 
     for (int i=0; i< name.length; i++) { 
      merged[i] = name[i]+"=="+marks[i]; 
     } 
     Arrays.sort(merged); 
     for(int i = 0; i < merged.length; i++) { 
      System.out.println((i+1) + ". "+ merged[i].split("==")[0] + "\t\t" + merged[i].split("==")[1]); 
     } 
0

Das Zusammenführen eines String-Arrays und eines Integer-Arrays ist nicht sinnvoll. Wenn Leistung für Sie nicht vorrangig ist, ist es viel besser, die Lösung objektorientiert zu implementieren. Ich würde eine Klasse erstellen, die Name und Marke enthält. Daher wird es eine Instanz dieser Klasse für jedes Namen- und Markierungspaar geben. Dann würde ich eine vergleichbare Schnittstelle implementieren, die diese Klasse sortierbar macht.

class Grade implements Comparable<Grade>{ 
    String name; 
    int mark; 

    public int compareTo(Grade o) { 
     return name.compareTo(o.name); 
    } 
} 
+0

Das ist gut, aber ich denke, die OP wollte nach Namen sortieren, nicht nach Marke. –

+0

Sie haben Recht, ich habe diesen Teil vermisst. Behoben. – regulus

2

Sie fragen nach einer Java-Klasse für Anfänger. Es gibt viele Beispiele im Netz über Vergleicher, Baumgruppen und alles andere in Java. Du musst dir definitiv Zeit nehmen und alles lesen, was du siehst, aber viele dieser Beispiele sind kristallklar. Wenn Sie etwas lernen wollen und es nicht für Sie arbeitet, verbringen Sie nicht mehr Zeit damit. Google einfach nochmal, auch wenn es die 15. oder 20. Erklärung ist, die endlich für dich funktioniert. Dies ist sehr häufig. Lies einfach nichts, bis du es verstehst.

Natürlich eine Klasse, um Ihre Zeichenfolge zu speichern, die Comparable implementiert, wie @regulus suggeriert, außer den Namen anstelle der Marke :) Speichern Sie die Marke auch in der Klasse, für zukünftige Referenz, oder wenn Sie es wünschen für einen sekundären Vergleich (nach dem Vergleich der Namen). Dies gibt Ihren Elementen eine natürliche Ordnung. Beim Erstellen jeder Objektinstanz ...

Fügen Sie sie in eine Instanz von Java's TreeSet ein. Hier ist ein Beispiel für die Verwendung:

Es wäre super schnell, weil es sortiert ist, wie Sie Schlüssel einfügen.

0

Es kann mit zwei Möglichkeiten

  1. getan werden, wenn die Sortierung in nur dem Namen nach, fügen Sie den Namen und Marken zu TreeMap als Schlüssel und Wert, der automatisch sortiert.
  2. Wenn nach beiden sortiert werden muss, erstellen Sie eine Klasse mit diesen Variablen und implementieren Sie die vergleichbare Schnittstelle.
0

Erstellen Sie eine neue Vergleichbare Klasse NameScore

public class NameScore implements Comparable<NameScore> { 

private final String name; 
private final int marks; 

public NameScore(String name, int marks) { 
    this.name = name; 
    this.marks = marks; 
} 

@Override 
public int compareTo(NameScore other) { 
    // compare by name 
    return this.name.compareTo(other.name); 

    // compare by (ascending) marks 
    //return this.marks - other.marks; 
} 

@Override 
public String toString() { 
    return "" + name + " (" + marks + ")"; 
} 
} 

Hier ist, wie NameScore zu benutzen, um Ihre Frage zu lösen:

public static void main(String[] args) { 
    String name[] = {"Percy", "Daniel", "Layla"}; 
    int marks[] = {90, 87, 91}; 

    List<NameScore> list = new LinkedList<NameScore>(); 
    for (int i = 0; i < marks.length; i++) { 
     NameScore element = new NameScore(name[i], marks[i]); 
     list.add(element); 
    } 

    System.out.println("BEFORE : "+list); 

    Collections.sort(list); 

    System.out.println(" AFTER : "+list); 
} 
1

so etwas wie dieses Versuchen:

 String name[] = {"Percy", "Daniel", "Layla"}; 
     int marks[] = {90, 87, 91}; 
     ArrayList<String> arrayList = new ArrayList<String>(); 
     System.out.println("Before Sorting.."); 
     for (int i = 0; i < name.length; i++) { 
      arrayList.add(name[i] + " " + marks[i]); 
      //Before Sorting 
      System.out.println(i + 1 + " " + name[i] + " " + marks[i]); 
     } 

     Collections.sort(arrayList); 
     //After Sorting 
     System.out.println("After Sorting.."); 
     for (int i = 0; i < arrayList.size(); i++) { 
      System.out.println(i + 1 + " " + arrayList.get(i)); 
     } 
1

Es gibt keine Standardlösung. Versuchen Sie, diese

static void sort(String[] name, int[] marks) { 
    for (int i = 0; i < name.length; i++) { 
     for (int j = i; j > 0 && (name[j - 1]).compareTo(name[j]) > 0; j--) { 
      swap(name, j, j - 1); 
      swap(marks, j, j - 1); 
     } 
    } 
} 

private static void swap(String[] x, int a, int b) { 
    String t = x[a]; 
    x[a] = x[b]; 
    x[b] = t; 
} 

private static void swap(int[] x, int a, int b) { 
    int t = x[a]; 
    x[a] = x[b]; 
    x[b] = t; 
} 

Dies ist eine modifizierte Version des Einsetzens Sortieralgorithmus von Arrays.sort

1

Unter der Annahme, dass Sie einen eindeutigen Namen haben, können Sie HashMap verwenden können, einen Namen Marken Paar zu haben. Map gibt sein Keyset (Name in diesem Fall) sortiert zurück.

String name[] = {"Percy", "Daniel", "Layla"}; 
int marks[] = {90, 87, 91}; 

if (name.length!=marks.length){ 
    System.exit(0); 
} 
HashMap<String, Integer> hm = new HashMap<String, Integer>(); 
for(int i=0;i<name.length;i++){ 
    hm.put(name[i], marks[i]); 
} 

ArrayList<String> keys = new ArrayList<String>(hm.keySet()); //for descending order 
for(int i=keys.size()-1, j=0; i>=0;j++,i--){ 
    System.out.println((j+1)+". "+keys.get(i)+"\t\t"+hm.get(keys.get(i))); 
} 
+0

Kumpel, es gab einen Tippfehler in der Frage, ich reparierte es. Entspann dich! Wenn Sie irgendwelche Kommentare zu meiner Antwort haben, würde ich mich freuen, sie zu diskutieren :) –

+0

Auf Ihrem Link spricht der Typ über den Code, weil es einige "finde mein Fehler" -Problem war. Die Frage, die hier gestellt wird, handelt nicht von "was ist falsch in meinem Code?", Hier geht es um "Was ist der beste Weg, es zu tun?". Ich würde Ihrer Besorgnis zustimmen, aber sie ist im Kontext dieser Frage nicht gültig. –

+0

[lesen Sie den zweiten Absatz:)] (http://meta.stackexchange.com/a/88636/237693) "Es ist nicht, was bewirkt, dass der Code nicht funktioniert". Für diese Frage ist es ein Tippfehler. Das kleine Zitat ist kein Problem. Noch einmal, die Frage, die hier gestellt wird, handelt nicht von "was ist falsch in meinem Code?", Hier geht es um "Was ist der beste Weg, es zu tun?". –

1

Ihr Problem kann leicht gelöst werden mit einem Map. A Map ist eine Klasse, die zum Speichern von verknüpften Datenpaaren verwendet werden kann, wobei jedes Paar einen "Schlüssel" und einen "Wert" hat. Sobald Sie in der Karte gespeichert sind, können Sie schnell einen Wert nachschlagen, wenn Sie den entsprechenden Schlüssel haben. Es gibt auch eine Möglichkeit, alle Schlüssel in der Karte zu iterieren oder aufzulisten.

Hier ist ein einfaches Programm, das zeigt, wie ein Map zu verwenden, um das Problem zu lösen:

import java.util.*; 

public class Example 
{ 
    public static void main(String[] args) 
    { 
     String[] name = new String[] {"Percy", "Daniel", "Layla"}; 
     int[] marks = new int[] {90, 87, 91}; 

     // First create a TreeMap to hold the data. A TreeMap is a special 
     // kind of Map which keeps the keys in sorted order for you. 
     // In this TreeMap, the keys will be Strings and the values 
     // will be Integers. 
     TreeMap<String, Integer> map = new TreeMap<String, Integer>(); 

     // Next, link each name in the names array to the corresponding mark 
     // by putting them in the TreeMap. Each name becomes a key 
     // in the map, and each mark is a value. 
     for (int i = 0; i < name.length; i++) 
     { 
      map.put(name[i], marks[i]); 
     } 

     // Now we can iterate over the keys in the map, and for each key 
     // retrieve the corresponding value. The TreeMap guarantees 
     // the keys will be in sorted order. 
     for (String key : map.keySet()) 
     { 
      System.out.println(key + "\t" + map.get(key)); 
     } 
    } 
} 

Hier wird der Ausgang:

Daniel 87 
Layla 91 
Percy 90 
Verwandte Themen