2011-04-24 89 views
2

我有一個樹形圖,有排序的信息(我排序的哈希映射的值,而不是關鍵),但是當我想將它們寫入到屬性文件中時,順序不是序列。有什麼問題?誰能幫我?java寫屬性文件

ArrayList<Integer> values = new ArrayList<Integer>(); 
values.addAll(wordcount.values()); 

Collections.sort(values, Collections.reverseOrder()); 

ValueComparator bvc = new ValueComparator(wordcount); 
TreeMap<String, Integer> sorted_map = new TreeMap(bvc); 
sorted_map.putAll(wordcount); 

Properties props=new Properties(); 
FileInputStream fis=new FileInputStream("abc.properties"); 
props.load(fis); 

for (Integer i : values) { 
    for (String s : sorted_map.keySet()) { 
     if (sorted_map.get(s) == i){ 
      props.setProperty(s, String.valueOf(i)); 
      props.store(new FileOutputStream("abc.properties"), null); 
      break; 
     } 
    } 
} 
+2

請發表你的代碼。 – Mat 2011-04-24 06:38:08

回答

0

根據定義,TreeMap按鍵排序。你可以在鍵之間建立一個新的比較函數,但是你必須交換鍵和值的角色來獲得你想要的。讓K和V是你的鍵和值的類型。

TreeMap<V,K> tree = new TreeMap<V,K>() 

for (Entry<K,V> entry : yourHashMap.entrySet()) 
tree.put(entry.getValue(), entry.getKey()); // note swap 

for (Entry<V,K> entry : tree.entrySet()) 
properties.add(...) 
+0

但樹圖中的數據是排序的。在我的代碼中,sorted_map是存儲排序數據,問題是當我在屬性文件中設置屬性時,順序不是順序,不像sorted_map中的順序。 – user1321450 2011-04-24 06:57:19

2

如果使用java.util.Properties鍵 - 值對存儲在一個HashMap不保持任何順序不管你怎麼一個HashMap中插入排序的值。

將它們寫入文件以保持排序的唯一方法是通過自己實現輸出。

+0

如何實現? – user1321450 2011-04-24 07:08:42

+0

是你的意思是使用緩衝區寫入器? – user1321450 2011-04-25 06:35:06

+0

@stacker的鏈接不再有效。查看我的答案,瞭解如何根據需要擴展屬性。 – mwoodman 2013-04-22 16:20:13

3

這裏是通過存儲屬性,這將給的擴展你整理鍵,條目的toString()輸出,文件輸出():

import java.util.*; 

/** 
* Extension of Properties with sorted keys for alphabetic output. 
* Neither optimized for performance nor thread-safety. 
*/ 
public class SortedProperties extends Properties { 

/** 
* Called throughout by Properties, including 
* Properties.store(OutputStream out, String comments). 
*/ 
@Override 
public synchronized Enumeration<Object> keys() { 
    return new Vector(this.keySet()).elements(); 
} 

/** 
* Called by Properties.stringPropertyNames() and this.keys(). 
*/ 
@Override 
public Set<Object> keySet() { 
    Set<Object> keySet = super.keySet(); 
    if(keySet==null) return keySet; 
    return new TreeSet(keySet); 
} 

/** 
* Called by Properties.toString(). 
*/ 
@Override 
public Set<Map.Entry<Object, Object>> entrySet() { 
    Set<Map.Entry<Object, Object>> entrySet = super.entrySet(); 
    if (entrySet==null) return entrySet; 

    Set<Map.Entry<Object, Object>> sortedSet = new TreeSet(new EntryComparator()); 
    sortedSet.addAll(entrySet); 
    return sortedSet; 
} 

/** 
* Comparator for sorting Map.Entry by key 
* Assumes non-null entries. 
*/ 
class EntryComparator implements Comparator<Map.Entry<Object, Object>> { 

    @Override 
    public int compare(Map.Entry<Object, Object> entry1, Map.Entry<Object, Object> entry2) { 
     return entry1.getKey().toString().compareTo(entry2.getKey().toString()); 
    } 

} 

}