2012-04-23 87 views
14

Tôi có biến Thuộc tính và đôi khi tôi cần phải thêm các Thuộc tính khác vào biến đó.Cách sắp xếp Thuộc tính trong 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); 

Tôi muốn sắp xếp myBasicProps sau này. Tôi không muốn lấy tất cả các khóa và giá trị, sắp xếp chúng với Collections.sort() và sau đó đặt tất cả vào một đối tượng mới. Có cách nào tốt hơn?

+1

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

+3

@Thillakan tôi dán vào liên kết tương tự, nhưng đã xóa nó sau khi đọc "Tôi không muốn để có được tất cả các khóa và giá trị, hãy sắp xếp chúng với Collections.sort() ... " –

Trả lời

19

Không, java.util.Properties kéo dài java.util.Hashtable không xác định thứ tự sắp xếp có thể dự đoán cho khóa hoặc giá trị.

Bạn có thể thử đổ tất cả các giá trị vào một cái gì đó như java.util.TreeMap, sẽ áp đặt thứ tự tự nhiên trên các phím của bạn.

+1

Điều này có nghĩa là trường hợp chữ hoa đầu tiên và sau đó là chữ thường. – Artem

15

tất cả những gì bạn phải làm là tạo lớp mở rộng Thuộc tính. source: 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(); 
    } 

} 

nó hoạt động cho tôi.

+2

Phiên bản Java 8: ArrayList result = Collections.list (super.keys()); Collections.sort (kết quả, (a, b) -> a.toString(). CompareTo (b.toString())); trả lại Bộ sưu tập.thống kê (kết quả); – user2069723

2

nó đơn giản hơn nhiều để chỉ sắp xếp các phím:

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

Collections.sort(keys); 
5

@ danisupr4 có giải pháp tốt nhất.

tôi sẽ cải thiện nó một chút, do đó bạn sẽ không nhận được bất kỳ cảnh báo trong IDE của bạn:

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

bạn có thể ghi đè lên phím() phương pháp để tiết kiệm tài sản được sắp xếp trong file 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); 
} 

và ghi đè phương thức stringPropertyNames() để lưu thuộc tính được sắp xếp trong tệp xml:

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

TreeMap nên là cách đơn giản nhất:

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(); 
} 
Các vấn đề liên quan