我有一个包含以下内容的文档:
32:{15,25,65}
43:{90,45,12}
65:{50}
我想要映射这些字符串并尝试:
public static void Collect(String entry)
{
entry = entry.replace("{", "");
entry = entry.replace(" "," ");
String[] lines = entry.split(" }");
Map<Integer, Integer[]> map = new HashMap<>();
List<Integer> temp = new ArrayList<>();
for(String s : lines)
{
if(!s.contains(":"))
continue;
int owner = Integer.parseInt(removeReverse(s, ":", 1).replace(" ","");
if(s.contains(",") {
if(s.contains(",")) {
for(String s1 : s.split(",")) {
s1 = removeUntil(s1,":",1);
temp.add(Integer.parseInt(s1));
}}
map.put(owner, (Integer[]) temp.toArray());
}
else {
temp.add(Integer.parseInt(formatter(s,"{","}"));
map.put(owner, (Integer[]) temp.toArray());
}
}
}
参考方法:
public static String formatter(String text,String start,String end)
{
if(text.length() == 0) return null;
int s = text.lastIndexOf(start)+start.length();
int e = text.indexOf(end);
return text.substring(s,e);
}
public static String removeUntil(String str, String c, int st)
{
StringBuilder sb = new StringBuilder(str);
str = sb.reverse().toString();
for(int i = 0;i<st;i++)
str = str.substring(0,str.lastIndexOf(c));
sb = new StringBuilder(str);
str = sb.reverse().toString();
return str;
}
public static String removeReverse(String str,String c,int st)
{
StringBuilder sb = new StringBuilder(str);
sb = new StringBuilder(removeUntil(sb.reverse().toString(),c,st));
return sb.reverse().toString();
}
毕竟,我试图在main方法中打印“map的entrySet”作为
map.entrySet().forEach(Operator::print);
Operator.print方法 - &gt;
public static void print(Object o)
{
System.out.print(o);
}
但是,输出是一个例外。出 - &gt;
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -1
at java.lang.String.substring(String.java:1954)
at Operator.removeUntil(Operator.java:23)
at Operator.removeReverse(Operator.java:31)
at Operator.readHashTable(Operator.java:122)
at MainScreen.main(MainScreen.java:38)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
答案 0 :(得分:0)
您的算法存在错误。我将您的代码复制到我的IDE中,并成功重新创建了相同的错误。问题是对removeUntil()
的第三次调用。进一步的分析表明,removeUntil
试图找到不在那里的数字52的工作(在第一行中混合15 25)。
你的代码混乱而且令人困惑。我给你的建议是:简化你的算法,在你的脑海中复习(或使用纸张),如果是带有打印数字的财务对象,你会怎么做?可能你会先拆分线,然后用':'拆分,最后用','拆分
答案 1 :(得分:-1)
或者,您可以使用正则表达式来匹配它,然后您可以使用第二个组上的拆分获取每个条目的整数组。
static Pattern pattern = Pattern.compile("(\\d+) \\: \\{\\s+([^}]+)\\s+\\}");// : \\{(?:\\s+(\\d+),?)\\s\\}$");
public static void main(String[] args) throws Exception {
InputStream resourceAsStream = FileRead.class.getResourceAsStream("/numbers.txt");
String content = IOUtils.toString(resourceAsStream);
System.out.println("collec: " + collect(content));
}
public static Map<Integer, Integer[]> collect(String content) {
Map<Integer, Integer[]> map = new HashMap<Integer, Integer[]>();
Matcher matcher = pattern.matcher(content);
// System.out.println("content: " + content);
while (matcher.find()) {
String strKey = matcher.group(1);
Integer intKey = Integer.parseInt(strKey);
String intGroupStr = matcher.group(2);
String[] intValueStr = intGroupStr.split(", ");
Integer[] intArray = new Integer[intValueStr.length];
for (int i = 0; i < intValueStr.length; i++) {;
intArray[i] = Integer.parseInt(intValueStr[i]);
// System.out.println("intArray[" + i + "] " + intArray[i]);
}
map.put(intKey, intArray);
}
return map;
}