Подтвердить что ты не робот

Файл свойств со списком в качестве значения для отдельного ключа

Для моей программы я хочу прочитать ключ из файла свойств и связанный с ним список значений для ключа.
Недавно я так старался

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]}
Я искал в Интернете так, но ничего не нашел. Хотелось бы, чтобы был способ. Любая помощь?

4b9b3361

Ответ 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. * и создаст список. НТН