Получить строку из значений в HashMap при определенном появлении специального символа - PullRequest
0 голосов
/ 29 октября 2018

Итак, я пытаюсь получить определенные подстроки в значениях в Hashmap, сконструированном следующим образом.

HashMap<ID, "Home > Recipe > Main Dish > Chicken > Chicken Breasts">

Который передается из другого метода, который возвращает HashMap

В приведенном выше примере мне нужно получить курицу.

Пока у меня есть ..

public static ArrayList<String> generalize() {
    HashMap<String, String> items = new HashMap<>();
    ArrayList<String> cats = new ArrayList<>();
    items = RecSys.readInItemProfile("PATH", 0, 1);
    for(String w : items.values()) {
        cats.add(w);
    }

    for(String w : cats) {

        int e = w.indexOf('>', 1 + w.indexOf('>', 1 + w.indexOf('>')));

        String k = w.substring(e+1);

        System.out.print(k);

        e = 0;
    }
    System.out.println("k" + cats);
    return cats;
}

Где я пытаюсь обнулить String e для каждой итерации (я знаю, что это избыточно, но это было просто для проверки).

В моем наборе данных первая пара k-v -

3880=Home  >  Recipes  >  Main Dish  >  Pasta, 

Мой вывод

Pasta

Что нормально. Если их больше 3x,>>, будут возвращены все следующие категории. Оптимально, что это не будет делать, но это нормально, если это так. Тем не менее, в дальнейшем, по-видимому, случайным образом возвращается

Home > Recipe

Вместе с остальными данными ... Я полагаю, это происходит в 6-м цикле.

Любая помощь приветствуется.

Edit:

Чтобы уточнить, у меня есть файл .csv, содержащий 3 столбца, тогда как 2 используются в этой функции (идентификатор и категория). Они передаются этой функции методом чтения в другом классе.

Что мне нужно сделать, это извлечь обобщенное описание каждой категории, которое во всех случаях является третьим экземпляром спецификации категории (то есть всегда между третьим и четвертым «>» в ​​каждой паре k-v).

Моя идея состояла в том, чтобы просто поместить все значения в массив, и для каждого значения извлечь строку между третьим и четвертым ">".

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Если можешь. измените структуру данных на HashMap<Integer, List<String>> или HashMap<Integer, String[]>. Лучше хранить категории (под cats вы имеете в виду категории, верно?) В коллекции, а не в строке.

Тогда вы легко можете получить третий предмет.

Если это невозможно. Вы должны сделать некоторую отладку. Начните с печати каждой входной и выходной пары и выясните, какой вход вызвал неожиданный вывод. На первый взгляд ваш indexOf метод работает.

Либо попробуйте этот метод регулярных выражений:

String k = cats.replaceAll("(?:[^>]+\\s*>\\s*){3}([^>]+).*", "$1");
System.out.println(k);

Регулярное выражение в основном ищет шаблон xxx > yyy > zzz > aaa ... и заменяет этот шаблон на aaa (независимо от того, что находится в исходной строке).

0 голосов
/ 29 октября 2018

Я рекомендую использовать следующую карту:

Map<Integer, List> map = new HashMap<>();
String[] vals = new String[] { "HomeRecipe", "Main Dish", "Chicken",
    "Chicken Breasts" };
map.put(1, Arrays.asList(vals));

Затем, если вам нужно найти заданное значение в исходной строке, используя ID, вы можете просто вызвать ArrayList#get() в определенной позиции. Если вас не волнует порядок, то здесь может иметь смысл использовать карту целых чисел и множеств.

...