【问题标题】:Ordering keys in .properties file alphabetically while ignoring case sensitivity按字母顺序排列 .properties 文件中的键,同时忽略区分大小写
【发布时间】:2015-09-04 03:48:52
【问题描述】:

我有这个函数,它将 .properties 文件中的值存储到树形图 (translatedMap) 中,然后从“keyMap”中检索新值并将它们也存储到“translatedMap”中。问题是无论我做什么,似乎总是将大写键与非大写键分开。这是我的代码:

Properties translation = new Properties(){

        private static final long serialVersionUID = 1L;

        @Override
        public synchronized Enumeration<Object> keys() {

            return Collections.enumeration(new TreeSet<Object>(super
                    .keySet()));
        }

    };


    //creates file and stores values of keyMap into the file
    try {
        TreeMap<String, String> translatedMap = new TreeMap<String, String>(String.CASE_INSENSITIVE_ORDER);

        InputStreamReader in = new InputStreamReader(new FileInputStream(filePath), "UTF-8");
        translation.load(in);

        // Store all values to TreeMap and sort
        Enumeration<?> e = translation.propertyNames();
        while (e.hasMoreElements()) {
            String key = (String) e.nextElement();
            if (key.matches(".#")) {
            } else {
                String value = translation.getProperty(key);
                translatedMap.put(key, value);
            }
        }

        // Add new values to translatedMap
        for (String key : keyMap.keySet()) {
            // Handle if some keys have already been added; delete so they can be re-added
            if (translatedMap.containsKey(key)) {
                translatedMap.remove(key);
            }
            translatedMap.put(key, keyMap.get(key));
        }

        in.close();
        translation.putAll(translatedMap);
        File translationFile = new File(filePath);

        OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(translationFile, false), "UTF-8");
        translation.store(out, null);

        out.close();
    } catch (IOException e) {
            e.printStackTrace();
    }
}

我得到的输出是这样的:

CAPITALIZED_KEY1=value1
CAPITALIZED_KEY2=value2
alowercase.key=value3
另一个lowercase.key=value4
morelowercase.keys=value5

当我希望它出现时:

alowercase.key=value3
另一个lowercase.key=value4
CAPITALIZED_KEY1=值1
CAPITALIZED_KEY2=值2
morelowercase.keys=value5

【问题讨论】:

  • 我不确定我是否理解您的问题。您能否简要说明正在发生的事情与您期望发生的事情?
  • 请写出你得到的输出和想要的输出。

标签: java treemap properties-file


【解决方案1】:

属性没有排序。不管你插入什么顺序,或者如果你用排序的东西调用 putAll(),它们都扩展了 Hashtable。见here

【讨论】:

    【解决方案2】:

    基本问题是 - 尽管排序不区分大小写 - 但有序映射仍应区分大小写,因为属性名称区分大小写。

    因此覆盖属性,并在编写时对名称进行排序,不区分大小写。

    public class SortedProperties extends Properties {
    
        @Override
        public void store(Writer writer, String comments)
                throws IOException {
            List<String> names = new ArrayList<>();
            for (Enumeration<?> en = propertyNames(); en.hasMoreElements(); ) {
                String name = en.nextElement().toString();
                names.add(name);
            }
            Collections.sort(names, new Comparator<String>() {
                @Override
                public int compareTo(String other) {
                    toLowerCase().compareTo(other.toLowerCase());
                }
            });
            //... write all properties
        }
    

    【讨论】:

    • 是的,这有点麻烦,而且我的回答也比较简陋。
    • 我似乎无法覆盖存储功能来工作......所以我最终选择了这样的东西......这样做有什么问题吗?所以我才意识到我不能在 cmets 中发布代码,抱歉所有的编辑,
    • 唯一的问题是密钥AAA 和密钥aaa 相等,覆盖另一个产生一个条目。但是,您可以使用简单的 HashMap 进行存储,然后对 keySet() 的副本进行排序
    【解决方案3】:

    为了实现这一点,我最终完全避免了 store 功能。我在treeMap中进行了排序。我使用缓冲写入器并写入文件。像这样:

    Properties translation = new Properties();
    
    
        //creates file and stores values of keyMap into the file
        try {
            TreeMap<String, String> translatedMap = new TreeMap<String, String>(new Comparator<String>() {
                public int compare(String o1, String o2) {
                    return o1.toLowerCase().compareTo(o2.toLowerCase());
                }
            });
    
            InputStreamReader in = new InputStreamReader(new FileInputStream(filePath), "UTF-8");
            translation.load(in);
    
            // Store all values to TreeMap and sort
            for (String key : translation.stringPropertyNames()) {
                keyMap.put(key, translation.getProperty(key));
            }
    
            in.close();
    
    
            Iterator<String> it = keyMap.keySet().iterator();
            while (it.hasNext()) {
                String key = it.next();
                translatedMap.put(key, keyMap.get(key));
            }
    
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(filePath, false), "UTF-8"));
    
            bw.write("#" + new Date().toString());
            bw.newLine();
    
            Iterator<String> it2 = translatedMap.keySet().iterator();
            while (it2.hasNext()) {
                String key = it2.next();
                bw.write(key + '=' + translatedMap.get(key));
                bw.newLine();
            }
    
    
            bw.close();
        } catch (IOException e) {
                e.printStackTrace();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-14
      • 2012-09-20
      • 2011-11-20
      • 1970-01-01
      • 1970-01-01
      • 2021-03-20
      • 1970-01-01
      • 2023-03-27
      相关资源
      最近更新 更多