属性文件,其中列表作为单个键的值

2022-09-01 08:10:28

对于我的程序,我想从属性文件中读取一个键,并为该键读取一个关联的值列表。
最近我像这样尝试

public static Map<String,List<String>>categoryMap = new Hashtable<String, List<String>>();


    Properties prop = new Properties();


    try {

        prop2.load(new FileInputStream(/displayCategerization.properties));
        Set<Object> keys = prop.keySet();
        List<String> categoryList = new ArrayList<String>();
        for (Object key : keys) {
            categoryList.add((String)prop2.get(key));
            LogDisplayService.categoryMap.put((String)key,categoryList);
        }
        System.out.println(categoryList);
        System.out.println("Category Map :"+LogDisplayService.categoryMap);

        keys = null;
        prop = null;

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

我的属性文件如下 -

A=APPLE
A=ALPHABET
A=ANT
B=BAT
B=BALL
B=BUS

我想要对于键A应该有一个包含的列表,而B包含。
所以地图应该是这样的,但我得到

我在互联网上搜索了这样的方式,但什么也没找到。我希望应该有办法。有什么帮助吗?[APPLE, ALPHABET,ANT][BAT,BALL,BUS]{A=[APPLE, ALPHABET,ANT], B=[BAT,BALL,BUS]}{A=[ANT], B=[BUS]}


答案 1

尝试将属性编写为逗号分隔列表,然后在加载属性文件后拆分值。例如

a=one,two,three
b=nine,ten,fourteen

您还可以使用 org.apache.commons.configuration 并使用 AbstractConfiguration.setListDelimiter(char) 方法更改值分隔符(如果您在值中使用逗号)。


答案 2

逗号分隔列表选项是最简单的,但如果值可以包含逗号,则具有挑战性。

下面是 a.1、a.2、...方法:

for (String value : getPropertyList(prop, "a"))
{
    System.out.println(value);
}

public static List<String> getPropertyList(Properties properties, String name) 
{
    List<String> result = new ArrayList<String>();
    for (Map.Entry<Object, Object> entry : properties.entrySet())
    {
        if (((String)entry.getKey()).matches("^" + Pattern.quote(name) + "\\.\\d+$"))
        {
            result.add((String) entry.getValue());
        }
    }
    return result;
}