2012-04-23 27 views
14

Mam zmienną Properties i czasami muszę dodać do niej inne właściwości.Jak sortować właściwości w java?

Properties myBasicProps = this.getClass.getResourceAsStream(MY_PROPS_PATH); 
... 
Properties otherProps = new Properties(); 
otherProps.load(new StringReader(tempPropsString)); //tempPropsString contains my temporary properties 
myBasicProps.putAll(otherProps); 

Chcę po tym sortować myBasicProps. Nie chcę uzyskać wszystkich kluczy i wartości, posortuj je za pomocą Collections.sort(), a następnie umieść je wszystkie w nowym obiekcie. Czy istnieje lepszy sposób?

+1

http://www.rgagnon.com/javadetails/java-0614.html – nayakam

+3

@Thillakan i wklejony tym samym łączu, ale ona usunięta po przeczytaniu „nie chcę aby uzyskać wszystkie klucze i wartości, posortuj je przy pomocy Collections.sort() ... " –

Odpowiedz

19

Nie, java.util.Properties rozszerza java.util.Hashtable, który nie definiuje przewidywalnego porządku sortowania dla kluczy lub wartości.

Możesz spróbować wyrzucić wszystkie wartości do czegoś w rodzaju java.util.TreeMap, co nałoży naturalne porządkowanie kluczy.

+1

Będzie to oznaczać najpierw wielkie litery, a potem małe litery. – Artem

15

wszystko co musisz zrobić, to stworzyć klasę, która rozszerza właściwości. źródło: java2s.com

import java.io.FileOutputStream; 
import java.util.Collections; 
import java.util.Enumeration; 
import java.util.Properties; 
import java.util.Vector; 

public class Main{ 
    public static void main(String[] args) throws Exception { 
    SortedProperties sp = new SortedProperties(); 
    sp.put("B", "value B"); 
    sp.put("C", "value C"); 
    sp.put("A", "value A"); 
    sp.put("D", "value D"); 
    FileOutputStream fos = new FileOutputStream("sp.props"); 
    sp.store(fos, "sorted props"); 
    } 

} 
class SortedProperties extends Properties { 
    public Enumeration keys() { 
    Enumeration keysEnum = super.keys(); 
    Vector<String> keyList = new Vector<String>(); 
    while(keysEnum.hasMoreElements()){ 
     keyList.add((String)keysEnum.nextElement()); 
    } 
    Collections.sort(keyList); 
    return keyList.elements(); 
    } 

} 

to działa na mnie.

+2

Java 8 wersja: ArrayList result = Collections.list (super.keys()); Collections.sort (wynik, (a, b) -> a.toString(). CompareTo (b.toString())); return Collections.enumeration (wynik); – user2069723

2

to znacznie prostsze po prostu uporządkować klucze:

List<String> keys = new ArrayList<String>() 
for(String key : properties.stringPropertyNames()) { 
    keys.add(key) 
} 

Collections.sort(keys); 
5

@ danisupr4 ma najlepsze rozwiązanie.

chciałbym poprawić na nim lekko, więc nie otrzyma żadnych ostrzeżeń w swoim IDE:

public static class MyProperties extends Properties { 
    private static final long serialVersionUID = 1L; 

    public Enumeration<Object> keys() { 
     Enumeration<Object> keysEnum = super.keys(); 
     Vector<Object> keyList = new Vector<Object>(); 

     while (keysEnum.hasMoreElements()) { 
      keyList.add(keysEnum.nextElement()); 
     } 

     Collections.sort(keyList, new Comparator<Object>() { 
      @Override 
      public int compare(Object o1, Object o2) { 
       return o1.toString().compareTo(o2.toString()); 
      } 
     }); 

     return keyList.elements(); 
    } 
} 
2

można zastąpić klucze() Metoda zapisać posortowane właściwości w pliku txt:

//this method downloaded from edu.umd.cs.findbugs.config package 
@SuppressWarnings("unchecked") 
@Override 
public synchronized Enumeration<Object> keys() { 
    Set<?> set = keySet(); 
    return (Enumeration<Object>) sortKeys((Set<String>) set); 
} 
static public Enumeration<?> sortKeys(Set<String> keySet) { 
    List<String> sortedList = new ArrayList<String>(); 
    sortedList.addAll(keySet); 
    Collections.sort(sortedList); 
    return Collections.enumeration(sortedList); 
} 

i zastąpić stringPropertyNames() metoda zapisać posortowane właściwości w pliku xml:

@Override 
public Set<String> stringPropertyNames() { 
Set<String> tmpSet = new TreeSet<String>(); 
for (Object key : keySet()) 
{ 
    tmpSet.add(key.toString()); 
} 
    return tmpSet; 
} 
3

TreeMap powinny być najprostszym sposobem:

Properties myProps = this.getClass.getResourceAsStream(MY_PROPS_PATH); 

try { 
    myProps.load(new FileInputStream(extraPropertiesFilename)); 
     //you can load more properties from external file 

    Map<String, String> sortedMap = new TreeMap(myProps); 

    //output sorted properties (key=value) 
    for (String key : sortedMap.keySet()) { 
     System.out.println(key + "=" + sortedMap.get(key)); 
    } 

} catch (Exception e) { 
    e.printStackTrace(); 
}