所以我正在尝试像这样构造的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中,并为每个值从第三个和第四个“>”之间提取一个字符串。
答案 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
(无论原始字符串中的内容)替换该模式。