2016-04-19 3 views
0

Ich versuche herauszufinden, ob es eine einfache Möglichkeit gibt, zu erreichen, was ich mache. Grundsätzlich habe ich einige vordefinierte Werte über einige Städte in meiner Strings.xml. Aber Benutzer die Option zu ändere es, was ich intern als SharedPReferences speichern würde (im Wesentlichen überschreibe ich die Ressourcenwerte).Wert überschreiben in Ressource mit SharedPreference

Erstens nehme ich an, dass dies eine der richtigen Möglichkeiten ist, dies zu tun. Ich möchte meine Implementierung so einfach wie möglich halten, und ich gehe davon aus, dass dies ein akzeptabler Ansatz ist (wenn nicht, bitte geben Sie einen Vorschlag dazu an - aber das ist nicht das, was ich sehe).

Mein Problem ist, dass ich einen Iterator, List usw. verwende und daher verwende ich etwas gewundenen Code, um dies zu sortieren. Der Code lautet wie folgt:

 // Get our predefined cities from our resources file 
    String [] predefinedCities = res.getStringArray(R.array.predefined_cities); 
    ArrayList<String> predefinedCitiesMinusOverridden = new ArrayList<String >(); 

    // Add values from our custom cities onto the Adapter via SharedPreferences 
    prefs = getSharedPreferences(MY_PREFS_NAME, Context.MODE_PRIVATE); 
    Iterator<String> userCities = readCitiesFromPref(); 

    // Start of sort operation - to show these in alphabetical order 
    List<String> copyOfUserCities = new ArrayList<String>(); 
    while (userCities.hasNext()){ 

     copyOfUserCities.add(userCities.next()); 

    } 

    /* Code start to override resource value, i.e. remove resource value if 
     our SharedPreferences contain the city. This means user has over-ridden values 
    */ 

    int preDefCounter = 0; 

    for(int i=0; i<predefinedCities.length; i++){ // for each city in predefined city 

     boolean duplicateFound = false; 

     for(int j=0; j<copyOfUserCities.size(); j++) { // check if there is match in user defined value 

      if(predefinedCities[i].toString().equals(copyOfUserCities.get(j).toString())){ 

       duplicateFound = true; // Set that the string is found 
       break; // NO need to continue checking this further 

      } 

     } 

     // Here we finally find out whether to retain our preDefined city or not 
     if(!duplicateFound){ 

      predefinedCitiesMinusOverridden.add(preDefCounter, predefinedCities[i]); // Retain it as new String 
      preDefCounter++; // increment counter for our String Array 

     } 
    } 

/* End Code to remove duplicate values 
    */ 

    ArrayList<String> sortedCities = new ArrayList<String>(); 
    sortedCities.addAll(copyOfUserCities); 
    sortedCities.addAll(predefinedCitiesMinusOverridden); 
    Collections.sort(sortedCities); 
    sortedCities.add(0, "No City Selected"); // First selection should be "No City Selected" 

    //End sort operation 

    ArrayAdapter<CharSequence> adapter = new ArrayAdapter(
      this, 
      android.R.layout.simple_spinner_item, 
      sortedCities); 

Gibt es einen einfacheren Weg, dies zu Verwendung von 2-Arrays anstatt zu tun, 2 Loops, einen Zähler etc?

Jede Hilfe wäre viel

Dank

+0

entschuldigung der Code funktioniert. Ich schaute auf die falsche Klasse. Aber gibt es vielleicht eine einfachere Möglichkeit, die Duplizierung zu entfernen? Ich werde die Frage aktualisieren – zooter

+0

Check HashSet http://docs.oracle.com/javase/7/docs/api/java/util/HashSet.html –

Antwort

0

Sie ein Set Objekt verwenden können, anstelle von zwei ArrayList Objekte geschätzt. Sie haben ähnliche Vorgänge, aber unterschiedliches Verhalten für den Sammlungs-Typ Set.

Eine Sammlung, die keine doppelten Elemente enthält. Formal enthalten die Sätze kein Paar von Elementen e1 und e2, so dass e1.equals (e2) und am meisten ein Nullelement sind. Wie sein Name andeutet, modelliert diese Schnittstelle die mathematische Mengenabstraktion.