HashMap verwirrt mich

Heute ist auf der Insel Rügen so ein sch... Wetter, da ist wieder etwas Zeit um sich mit dieser Sache hier weiter zu befassen. Bis auf die Sortierung habe ich das nun (dank euch!) wie folgt hinbekommen. Und das ganze sieht jetzt wie folgt aus:

Code:
        String text = "";
        text += "ID4, Uhu4, Geier4, Fuchs4 \n";
        text += "ID1, Uhu1, Geier1, Fuchs1 \n";
        text += "ID3, Uhu3, Geier3, Fuchs3 \n";
        text += "ID2, Uhu2, Geier2, Fuchs2 \n";

        String[] zeilen = text.split("\n");

        ArrayList<MyData> MyList = new ArrayList<>();

        for ( int i = 0; i < zeilen.length; i++ ) {

            String[] zelle = zeilen[i].split(",");

            MyData tmp = new MyData();
            tmp.addMyData( zelle[0] );
            tmp.addMyData( zelle[1] );
            tmp.addMyData( zelle[2] );
            tmp.addMyData( zelle[3] );
            MyList.add( tmp );

        }

        Log.d("test", MyList.get(0).getMyData().get(1) );
        Log.d("test", MyList.get(3).getMyData().get(2) );

    }


    class MyData {

        public String id;
        public String a1;
        public String a2;
        public String a3;

        ArrayList<String> liste = new ArrayList();

        public MyData() {}
        public MyData(String id, String a1, String a2, String a3) {
            this.id = id;
            liste.add(a1);
            liste.add(a2);
            liste.add(a3);
        }

        public void addMyData(String val) {
            liste.add(val);
        }
        public ArrayList <String> getMyData() {
            return liste;
        }


        public void sort ()
        {
            Collections.sort(liste, new Comparator<String>()
            {
                public int compare(String a1, String a2)
                {
                    return a1.compareToIgnoreCase(a2);
                }
            });
        }

    }

Im Prinzip ist es genau das was mir vorschwebte. Aber das mit der Sortierung habe ich gar nicht verstanden. Mein Ziel ist es nun das fertige Array nach ID, oder nach Uhu, oder nach Geier etc. zu sortieren, also den Spalten.
 
Sorry, dass ich mich heir noch einmal einmische, dein Code funktioniert so nicht wirklich, hast du den wirklich einmal laufen lassen? Ich bekomme mehrere Kompilierfehler wenn ich den im AndroidStudio eingebe.

Code:
String text = "";
    text += "ID4, Uhu4, Geier4, Fuchs4 \n";
    text += "ID1, Uhu1, Geier1, Fuchs1 \n";
    text += "ID3, Uhu3, Geier3, Fuchs3 \n";
    text += "ID2, Uhu2, Geier2, Fuchs2 \n";

Eindach so:
Code:
String text =   "ID4, Uhu4, Geier4, Fuchs4 \n"
                  + "ID1, Uhu1, Geier1, Fuchs1 \n"
                  + "ID3, Uhu3, Geier3, Fuchs3 \n"
                  + "ID2, Uhu2, Geier2, Fuchs2 \n";

Um es so zu sortieren wie du es willst, dann muss die Funktion sort() aus deiner myData raus. Vermutlich kannst du den Comperator nicht verwenden weil du für deinen Sortierungs-Wunsch einen parameter übergeben musst. Ich schreib das mal um

fertig

Code:
public class MainActivity extends AppCompatActivity {
    static final int SORT_ID = 0;
    static final int SORT_UHU = 1;
    static final int SORT_GAIER = 2;
    static final int SORT_FUCHS = 3;

    String text = "ID4, Uhu4, Geier4, Fuchs4 \n"
            + "ID1, Uhu1, Geier1, Fuchs1 \n"
            + "ID3, Uhu3, Geier3, Fuchs3 \n"
            + "ID2, Uhu2, Geier2, Fuchs2 \n";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        String[] zeilen = text.split("\n");

        ArrayList<MyData> MyList = new ArrayList<>();

        for (int i = 0; i < zeilen.length; i++) {
            MyList.add( new MyData(zeilen[i]));
        }
       

        Collections.sort(MyList, new Comparator<MyData>()
            {
                public int compare(MyData d1 , MyData d2)
                {
                    String s1 = d1.data[SORT_GAIER];
                    String s2 = d2.data[SORT_GAIER];
                   
                    return s1.compareTo(s2);
                }
            });
    }


    class MyData {

        public String data[] = new String[4];

      
        public MyData(String zeile) {
            data = zeile.split(",");
        }

    }

}
 
Zuletzt bearbeitet von einem Moderator:
Nonsens schrieb:
hast du den wirklich einmal laufen lassen?

Sorry, aber bei mir läuft das, sonst hätte ich das sicherlich nicht gepostet :) Bis auf die Sache mit dem Sortieren. Aber das einlesen vom String, dem erstellen vom Array und meine Testausgaben laufen bei mir. Ebenfalls im Studio.
 
R4M schrieb:
Nonsens schrieb:
hast du den wirklich einmal laufen lassen?

Sorry, aber bei mir läuft das, sonst hätte ich das sicherlich nicht gepostet :) Bis auf die Sache mit dem Sortieren. Aber das einlesen vom String, dem erstellen vom Array und meine Testausgaben laufen bei mir. Ebenfalls im Studio.

Wie auch immer, aber ich bekam jede menge Fehler angezeigt. Aber, da ist Android Studio wohl etwas empfindlicher.

Schau dir mal meine Lösung an
 
Code:
        ...
        String text = "";
        text += "ID4, Uhu4, Geier4, Fuchs4 \n";
        text += "ID1, Uhu1, Geier1, Fuchs1 \n";
        text += "ID3, Uhu3, Geier3, Fuchs3 \n";
        text += "ID2, Uhu2, Geier2, Fuchs2 \n";

        String[] zeilen = text.split("\n");

        ArrayList<MyData> myList = new ArrayList<>();

        for ( int i = 0; i < zeilen.length; i++ ) {

            String[] zelle = zeilen[i].split(",");

            myData tmp = new MyData(zelle[0],zelle[1],zelle[2],zelle[3]});
            
            myList.add( tmp );

        }
        for (MyData data : myList) {
            Log.d("test", data.id+" "+data.a1+" "+data.a2+" "+data.a3);
        }
        sortId(liste);
        for (MyData data : myList) {
            Log.d("test", data.id+" "+data.a1+" "+data.a2+" "+data.a3);
        }
        sortA1(liste);
        for (MyData data : myList) {
            Log.d("test", data.id+" "+data.a1+" "+data.a2+" "+data.a3);
        }
    
        // usw.

    .......


    public void sortId (ArrayList<MyData> list)
    {
        Collections.sort(liste, new Comparator<String>()
        {
            public int compare(MyData a, MyData b)
            {
                return a.id.compareToIgnoreCase(b.id);
            }
        });
    }

    public void sortA1 (ArrayList<MyData> liste))
    {
        Collections.sort(liste, new Comparator<String>()
        {
            public int compare(MyData a, MyData b)
            {
                return a.a1.compareToIgnoreCase(b.a1);
            }
        });
    }

    public void sortA2 (ArrayList<MyData> liste))
    {
        Collections.sort(liste, new Comparator<String>()
        {
            public int compare(MyData a, MyData b)
            {
                return a.a2.compareToIgnoreCase(b.a2);
            }
        });
    }

    public void sortA3 ()
    {
        Collections.sort(liste, new Comparator<String>()
        {
            public int compare(MyData a, MyData b)
            {
                return a.a3.compareToIgnoreCase(b.a3);
            }
        });
    }


    class MyData {

        public String id;
        public String a1;
        public String a2;
        public String a3;

        public MyData() {}
        public MyData(String id, String a1, String a2, String a3) {
            this.id = id;
            this.a1 = a1;
            this.a2 = a2;
            this.a3 = a3;
        }

        public void addMyData(String val) {
            liste.add(val);
        }
        public ArrayList <String> getMyData() {
            return liste;
        }

    }

Das kann man auch noch dynamischer bauen. Aber das sei dir überlassen.
 
  • Danke
Reaktionen: R4M und swa00
Oh Danke, sieht etwas aufgeräumter aus als meine Version. Wichtig für mich ist die Sache zu stehen. Ich bin JS und PHP sehr stark belastet, da ist der Einstieg in JAVA (im Grunde nur für mich) nicht ganz so einfach. Vielen Dank für die Bemühungen!
 
Das Gefühl kenne ich. Java macht es einem nicht gerade einfach. Gerade für PHP - Entwickler ist der Sprung nicht so einfach. Bei Java muss man sauberer programmieren. :)
Hoffe wir konnten helfen.
[doublepost=1480197077,1480196075][/doublepost]@Nonsen:
"+="
Rheinwerk Computing :: Java ist auch eine Insel - 2 Imperative Sprachkonzepte

Das sind Grundlagen. Als Anfänger kann ich dir neben der obigen Quelle, noch das Buch "Java von Kopf bis Fuß" empfehlen: https://www.oreilly.de/buecher/120253/9783897214484-java-von-kopf-bis-fuß.htm
Ich denke mal, es ist keine verschwendete Zeit, wenn Du die Bücher mal durcharbeitest.
 
R4M schrieb:
Oh Danke, sieht etwas aufgeräumter aus als meine Version. Wichtig für mich ist die Sache zu stehen. Ich bin JS und PHP sehr stark belastet, da ist der Einstieg in JAVA (im Grunde nur für mich) nicht ganz so einfach. Vielen Dank für die Bemühungen!

ich denke mal dass du mich gemeint hast. Hast du dir das genau angeshen?

Code:
Collections.sort(MyList, new Comparator<MyData>()
            {
                public int compare(MyData d1 , MyData d2)
                {
                    String s1 = d1.data[SORT_GAIER];
                    String s2 = d2.data[SORT_GAIER];
                  
                    return s1.compareTo(s2);
                }
            });
[doublepost=1480200260,1480199346][/doublepost]
markus.tullius schrieb:

ich kenne diese Notation, jedoch funktioniert die irgendwie bei mir nicht richtig. Was immer funktioniert ist die klassische Schreibweise: a = a + b;

Und das dicke Buch "Java ist auch eine Insel" steht bei mir im Regal und ich hab noch ein dickes Buch, Java 5 und ja, die hab ich sogar gelesen und auch vieles wieder vergessen.

@R4M
mir ist auch PHP und JS bekannt, da ich beides beruflich brauchte. PHP nicht so sehr aber JS schon mehr. JS hat mächtige Werkzeuge im Umgang mit Array. Jedoch kannst das nicht auf Java übertragen. Am Besten streichst du bei Java die Arrays sowie du sie in JS/PHP gewohnt warst aus deinem Kopf und denkst nur noch in Objekten und Listen. Dann wird es dir leichter fallen mit Java zurecht zu kommen.

Grüße
 
@markus.tullius

Habe eben versucht deine Sortierfunktionen mal Testweise zum laufen zu bekommen, allerdings erhalte ich da diese Fehlermeldung:

Error:(69, 9) error: <anonymous de.domain.myapplication.MainActivity$1> is not abstract and does not override abstract method compare(String,String) in Comparator

Error:(68, 20) error: no suitable method found for sort(ArrayList<MainActivity.MyData>,<anonymous Comparator<String>>)
method Collections.<T#1>sort(List<T#1>) is not applicable
(cannot infer type-variable(s) T#1
(actual and formal argument lists differ in length))
 
Hallo R4M,

ich kann dir nicht mehr sagen, als aus Post #4 vorzugehen , dann wärst du schon LÄNGST
fertigt - PN dazu haste ja , wenn du erklärung willst
 
Zuletzt bearbeitet:
Hallo saw00,

ja deine PN hab ich natürlich :) Im Prinzip habe ich ja genau das als Vorlage genommen. Bei mir läuft das ganze allerdings leider nicht. Zum Testen sieht das ganze so aus.

Code:
package de.domain.myapplication;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

public class MainActivity extends AppCompatActivity {

    ArrayList<MyData> MyList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        String text = "";
        text += "ID4, Uhu4, Geier4, Fuchs4 \n";
        text += "ID1, Uhu1, Geier1, Fuchs1 \n";
        text += "ID3, Uhu3, Geier3, Fuchs3 \n";
        text += "ID2, Uhu2, Geier2, Fuchs2 \n";

        String[] zeilen = text.split("\n");

        MyList = new ArrayList<>();

        for ( int i = 0; i < zeilen.length; i++ ) {

            String[] zelle = zeilen[i].split(",");

            MyData tmp = new MyData();
            tmp.addMyData( zelle[0].trim() );
            tmp.addMyData( zelle[1].trim() );
            tmp.addMyData( zelle[2].trim() );
            tmp.addMyData( zelle[3].trim() );
            MyList.add( tmp );

        }

        Log.d("test", MyList.get(0).getMyData().get(1) );
        Log.d("test", MyList.get(3).getMyData().get(2) );

        sortA1(MyList);

        for (MyData data : MyList) {
            Log.d("test", data.id + " " + data.a1 + " " + data.a2 + " " + data.a3);
        }

    }


    public void sortA1 (ArrayList<MyData> liste) {
      Collections.sort(MyList, new Comparator<MyData>() {
        public int compare(MyData s1, MyData s2) {
          return s1.a1.compareToIgnoreCase(s2.a1);
        }
      });
    }


    class MyData {

        public String id;
        public String a1;
        public String a2;
        public String a3;

        ArrayList<String> liste = new ArrayList();

        public MyData() {}
        public MyData(String id, String a1, String a2, String a3) {
            this.id = id;
            liste.add(a1);
            liste.add(a2);
            liste.add(a3);
        }

        public void addMyData(String val) {
            liste.add(val);
        }
        public ArrayList <String> getMyData() {
            return liste;
        }

    }


}

Ich habe das ganze extra nicht in meine App eingebunden, sondern wirklich zum lernen und testen separat angelegt. Bei der Sortierfunktion kommt dieser Fehler:

Unable to start activity ComponentInfo{de.domain.myapplication/de.domain.myapplication.MainActivity}:
java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.compareToIgnoreCase(java.lang.String)' on a null object reference

Und bei dieser Schleife komme ich nur null angezeigt.

Code:
for (MyData data : MyList) {
   Log.d("test", data.id + " " + data.a1 + " " + data.a2 + " " + data.a3);
}

Als PHP-Programmierer hätte ich das so geschrieben - dann bekomme ich auch eine Ausgabe:

Code:
for ( int i = 0; i < MyList.size(); i++ ) {
    Log.d("test", MyList.get(i).getMyData().get(0) + " " + MyList.get(i).getMyData().get(1) );
}

Aber das ist Nebensache, soweit habe ich das alles (fast) verstanden. Nur bei der Sortierfunktion hab ich wohl noch einen Denkfehler.
 
Also bei aller liebe , das ist NICHT das Struct Beispiel aus meinem Post :)

Dein Problem ist folgendes :

a) meinen Post aus #4 haste erst mal stehen lassen
b) Nonsens hat dir ganz klar was "altes" Aufgetischt
c) Aufgrund deiner Vorkenntnisse und das von Nonsens bist du ganz klar in die falsche Richtung gehoppelt
d) Markus hat versucht, aus der Verwirrung das Beste zu machen und zu retten
e) Nonsens hat dann zum absoluten Chaos noch einen draufgesetzt

Und nun haste ein Kuddelmuddel der NIEMALS klappen kann

Deshalb die PN, dann wärst du 5 mal schlauer

Aber Dümpel du ruhig weiter :)
 
Zuletzt bearbeitet:
Oho, na dann muss ich selber einen Weg finden. Aber dennoch Danke, dass du (ihr) so viel Zeit für mich geopfert habt. Ich schaffe das schon :)
 
Kurzes Feedback: Habe noch mal "gedümpelt" und habe es letztlich hinbekommen. Jetzt habe ich die Sortierfunktion soweit erweitert, dass diese über ein Menü festgelegt werden kann. Damit gilt dieser Thread für mich als abgeschlossen.
 
Schwere Geburt, aber

HERZLICHEN GLÜCKWUNSCH :)
 
R4M
Wenn du mein Code nicht kopieren kannst, funktioniert das nicht. Dein Code kann nicht funktionieren, Vergleiche mal mein letztes Beispiel mit deinem Code. Da gibt riesige Unterschiede.
Und @Nonsen, es wäre mal schön, wenn du Dich hier um die Probleme der Leute hier kümmerst. Wenn du Leuten PHP beibringen willst, es gibt auch Forum für PHP-Entwickler. Danke.
 
Unter dem Avatar von Nonsens steht seit ein paar Tagen " In Löschung"
 
@markus.tullius

Nun ja, ich wollte ja nicht nur einfach einen Code kopieren und einfügen, sondern auch verstehen. Und da ist beim Zusammenbau wohl einiges schief gelaufen (hab es ja letztlich gesehen). Aber wollen wir mal nicht länger darauf reiten. Meine App nimmt langsam formen an. Nun bin ich bei neuen Herausforderungen, die sind jedoch nicht Gegenstand diesen Beitrages.
 

Ähnliche Themen

S
Antworten
49
Aufrufe
4.893
jogimuc
J
D
Antworten
3
Aufrufe
1.063
dandor
D
R4M
Antworten
20
Aufrufe
1.829
R4M
R4M
Zurück
Oben Unten