java写属性文件

java写属性文件,java,Java,我有一个树映射,它对信息进行了排序(我按hashmap的值排序,而不是按键排序),但当我想将它们写入属性文件时,顺序不是顺序。有什么问题?有人能帮我吗 ArrayList<Integer> values = new ArrayList<Integer>(); values.addAll(wordcount.values()); Collections.sort(values, Collections.reverseOrder()); ValueComparator b

我有一个树映射,它对信息进行了排序(我按hashmap的值排序,而不是按键排序),但当我想将它们写入属性文件时,顺序不是顺序。有什么问题?有人能帮我吗

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;
        }
    }
}
ArrayList值=新的ArrayList();
values.addAll(wordcount.values());
Collections.sort(值,Collections.reverseOrder());
ValueComparator bvc=新的ValueComparator(字数);
TreeMap sorted_map=新的TreeMap(bvc);
已排序的映射putAll(字数);
Properties props=新属性();
FileInputStream fis=新的FileInputStream(“abc.properties”);
道具载荷(fis);
对于(整数i:值){
对于(字符串s:sorted_map.keySet()){
如果(已排序的映射获取=i){
props.setProperty(s,String.valueOf(i));
props.store(新文件输出流(“abc.properties”),null);
打破
}
}
}

根据定义,树映射按其键排序。您可以在键之间创建一个新的比较函数,但必须将键的角色和值交换为您想要的。让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(...)
TreeMap tree=newtreemap()
for(条目:yourHashMap.entrySet())
tree.put(entry.getValue(),entry.getKey());//票据交换
for(条目:tree.entrySet())
属性。添加(…)

如果使用java.util.Properties,则键-值对存储在Hashmap中,无论如何在Hashmap中插入排序值,该Hashmap都不会保持任何顺序


将它们写入文件并保持其排序的唯一方法是自行实现输出。

这里有一个属性扩展,它将为您提供排序键、条目、toString()输出和通过store()输出的文件:

import java.util.*;
/**
*为字母输出扩展具有排序键的属性。
*既不针对性能也不针对线程安全进行优化。
*/
公共类SortedProperties扩展属性{
/**
*由属性调用,包括
*store(OutputStream out,字符串注释)。
*/
@凌驾
公共同步枚举密钥(){
返回新向量(this.keySet()).elements();
}
/**
*由Properties.stringPropertyNames()和this.keys()调用。
*/
@凌驾
公共集密钥集(){
Set keySet=super.keySet();
如果(keySet==null)返回keySet;
返回新树集(键集);
}
/**
*由Properties.toString()调用。
*/
@凌驾
公共集入口集(){
Set entrySet=super.entrySet();
if(entrySet==null)返回entrySet;
Set sortedSet=新树集(新入口比较器());
sortedSet.addAll(入口集);
返回分类集;
}
/**
*用于对地图进行排序的比较器。按键输入
*假定为非空条目。
*/
类EntryComparator实现Comparator{
@凌驾
公共整数比较(Map.Entry entry1,Map.Entry entry2){
返回entry1.getKey().toString().compareTo(entry2.getKey().toString());
}
}
}

请发布您拥有的代码。但树形图中的数据已排序。在我的代码中,排序映射是存储排序数据,问题是当我在属性文件中设置属性时,顺序不是顺序,与排序映射中的顺序不同。你的意思是使用缓冲区写入程序吗???@stacker的链接不再有效。请参阅我的答案,以了解按需要工作的属性的扩展。
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());
    }

}

}