Файл свойств со списком в качестве значения для отдельного ключа
Для моей программы я хочу прочитать ключ из файла свойств и связанный с ним список значений для ключа.
Недавно я так старался
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 должен существовать список, содержащий [APPLE, ALPHABET,ANT]
и B, содержащий [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;
}
Ответ 3
Если это требуется для обработки некоторых конфигурационных файлов, рассмотрите возможность использования конфигурации Apache. https://commons.apache.org/proper/commons-configuration/javadocs/v1.10/apidocs/index.html?org/apache/commons/configuration/PropertiesConfiguration.html
Он имеет путь к нескольким значениям для одного ключа. Формат немного отличается, хотя
key=value1,value2,valu3
дает три значения для одного и того же ключа.
Ответ 4
Ваша логика ошибочна... в основном вам нужно:
- получить список ключей
- если список равен null, создайте новый список и поместите его на карту
- добавить слово в список
Вы не делаете шаг 2.
Здесь код, который вы хотите:
Properties prop = new Properties();
prop.load(new FileInputStream("/displayCategerization.properties"));
for (Map.Entry<Object, Object> entry : prop.entrySet())
{
List<String> categoryList = categoryMap.get((String) entry.getKey());
if (categoryList == null)
{
categoryList = new ArrayList<String>();
LogDisplayService.categoryMap.put((String) entry.getKey(), categoryList);
}
categoryList.add((String) entry.getValue());
}
Обратите внимание также на "правильный" способ перебора элементов карты/свойств - через entrySet()
.
Ответ 5
Создайте обертку вокруг свойств и предположим, что у вашего значения есть ключи A.1, A.2 и т.д. Затем, когда вас спросят об A, ваша обертка прочитает все элементы A. * и создаст список. НТН