Bestimmter String aus Set Lesen

  • Antworten:7
  • OffenNicht stickyBentwortet
  • Forum-Beiträge: 381

12.09.2019, 21:58:15 via Website

Hallo zusammen

Ich möchte einen ganz bestimmten String aus einer Set auslesen. Dies mache ich in einer for-Schlaufe. Aber ich weiss nicht wo ich den Zäler "x" hintun soll.

private List<Ort> out_data(){
    List<Ort> orte = new ArrayList<Ort>();
    Set<String> str_name = new HashSet<String>();
    Set<String> str_breit = new HashSet<String>();
    Set<String> str_lang = new HashSet<String>();
    Ort pool = new Ort();

    SharedPreferences pref = getSharedPreferences(APP, 0);
    str_name = pref.getStringSet("ORTNAME", null);
    str_breit = pref.getStringSet("ORTBREIT", null);
    str_lang = pref.getStringSet("ORTLANG", null);
    for(int x=0; x < str_name.size(); x++){
        pool.name = str_name.toString();
        pool.breite = Double.parseDouble( str_breit.toString() );
        pool.laenge = Double.parseDouble( str_lang.toString() );
        orte.add( pool );
    }

    return orte;
}

Es geht um die folgende Zeile

pool.name = str_name.toString();

Wie kann ich genau ein String aus der Liste lesen?

Gruss Renato

Diskutiere mit!
Beste Antwort
  • Forum-Beiträge: 11.153

12.09.2019, 22:08:58 via Website

Hallo Renato,

eigentlich macht man das mit Iteratoren:

 for (String myString : str_name)  {
     //iteriere durch alle Namen
      } 

da du aber vermutlich die Einträge über den Index matchen willst, musst du dein Set in ein Array umwandeln:

String[] myArr = (String[])str_name.toArray();

dann kannst du wie gewohnt mit MyArr[idx] zugreifen und das für alle HashSets. (Für dich sind Sets aber eigentlich ungeeignet. Speicher es lieber gleich als StringArray in den Prefs)

Wieso machtst du dir das aber so Aufwändig?
Mach dir doch ein Objekt:

class Location{
String locationName;
double latitude;
double longitude;
}

Und machst dann eine List<Location> wo du alles drin speicherst.
Diese Liste kannst du dann serialisieren als String (entweder Binär + Base64 oder als Json) und dann in die SharedPrefs packen.
Dann hast du keinen Aufwand dir die ganzen Daten wieder mühsam zusammenzusuchen sondern hast immer als schön in Objekten drin.

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 381

13.09.2019, 21:15:57 via Website

Ciao Pascal

Genau so mache ich es auch. Aber ich habe nur ein "getStringSet" also bin ich davon ausgegangen, dass ich alles in das umwandeln muss.

Dein Vorschlag um eine "List" in den Speicher abzulegen klingt verlockend. Wie muss ich vorgehen damit es geht. Zur Zeit habe ich keine Ahnung.

Gruss Renato

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 11.153

14.09.2019, 08:57:25 via Website

Kommt immer darauf an wie du es umsetzen möchtest.

Erstmal baue dir das Objekt und mache ein paar Beispiele mit "hardcoded" Daten.

d.h. du erstellst dir ne neue Liste:

List<Location> locationList = new ArrayList<Location>();
locationList.add(new Location("MeinOrt",48.500d,9.812d)); 
//Impliziert dass du einen passendne Konstruktor programmierst.

Dann kannst du entweder Orte bei Namen finden indem du streams nutzt oder einfach über den Index.

Speichern kannst du es je nach belieben in Json und der Lib Gson (lesbarer String) oder standerd Serialize mit Java (string aber nicht mehr menschenlesbar).

Beim Speichern konvertierst du dann die Liste in einen String, schreibst diesen in die SharedPreferences und beim öffnen, liest du die Preferences un konvertierst es zurück in ein Objekt:
https://stackoverflow.com/questions/134492/how-to-serialize-an-object-into-a-string

Und mit Json: https://stackoverflow.com/a/16607559

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 381

15.09.2019, 21:40:19 via Website

Ciao Pascal

Herzlichen Dank für die Hilfe. Ich versuche es mal mit einem FileStream. Bei Json blicke ich noch nicht so durch.

Gruss Renato

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 381

23.09.2019, 18:26:16 via Website

Hallo zusammen

Wie oben empfolen habe ich folgendes gemacht.

arr_name = (String[]) str_name.toArray();

Jedoch führt das zu einem Fehler

java.lang.ClassCastException: java.lang.Object[] cannot be cast to java.lang.String[]

Könnte es daran liegen, dass ich erst ein Element darin habe?

Gruss Renato

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 11.153

23.09.2019, 20:45:39 via App

Nein, du musst dann vermutlich mit dem ObjectArray arbeiten und das Objekt pro Element Casten bzw. toString nutzen

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 381

23.09.2019, 21:35:53 via Website

Ich habe es nun wie folgt gemacht

 i = 0;
        for(Object breit : str_breit.toArray()){
            arr_breit[i] = (String) breit;
            i++;
        }

Auf jeden Fall läuft es so. Vielleicht hat jemand eine bessere Idee.

Hilfreich?
Diskutiere mit!