在特定的特殊字符出现时从HashMap中的值检索String

时间:2018-10-29 13:54:59

标签: java split hashmap substring

所以我正在尝试像这样构造的Hashmap中检索值中的特定子字符串。

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

是通过其他方法传递的,该方法返回HashMap

在上面的示例中,我需要检索Chicken。

到目前为止,我有..

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

与其余数据一起... 我相信,这发生在第六循环。

非常感谢您的帮助。

编辑:

为澄清起见,我有一个.csv文件,其中包含3列,而此函数中使用了2列(ID和类别)。这些通过另一个类中的read方法传递给此函数。

我需要做的是提取每个类别的一般性描述,在所有情况下,这都是类别说明的第三个实例(也就是说,在每对kv对中始终位于第三个和第四个“>”之间)。

我的想法是将所有值简单地放入一个arraylist中,并为每个值从第三个和第四个“>”之间提取一个字符串。

2 个答案:

答案 0 :(得分:0)

我建议使用以下地图:

add_header 'Access-Control-Allow-Origin' '*' always;

然后,如果您需要使用Map<Integer, List> map = new HashMap<>(); String[] vals = new String[] { "HomeRecipe", "Main Dish", "Chicken", "Chicken Breasts" }; map.put(1, Arrays.asList(vals)); 在原始字符串中找到给定值,则只需在特定位置调用ID。如果您根本不关心顺序,那么此处的整数到集合的映射可能更有意义。

答案 1 :(得分:0)

如果可以的话。将您的数据结构更改为HashMap<Integer, List<String>>HashMap<Integer, String[]>。最好将类别(用cats表示类别对吗?)存储在集合中而不是字符串中。

然后您可以轻松获得第三项。

如果这不可能。您需要进行一些调试。首先打印每个输入和输出对,然后找出哪个输入导致了意外的输出。乍看之下,您的indexOf方法似乎可以正常工作。

或者,尝试以下正则表达式方法:

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

regex基本上会寻找xxx > yyy > zzz > aaa ...模式,并用aaa(无论原始字符串中的内容)替换该模式。