我有一份文件,里面有这样的内容:
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();
}毕竟,我尝试在主方法中打印"map's entrySet“,如
map.entrySet().forEach(Operator::print);Operator.print方法->
public static void print(Object o)
{
System.out.print(o);
}但是,输出是一个例外。Out ->
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)发布于 2014-08-23 13:46:23
或者,您可以使用正则表达式来匹配它,然后可以使用第二个组上的拆分来获取每个条目的整数组。
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;
}发布于 2014-08-23 13:51:55
你的算法上有个错误。我将您的代码复制到我的IDE中,并成功地重新创建了相同的错误。问题是第三次呼叫removeUntil()。进一步的分析表明,removeUntil正在试图找到不存在于其中的数字52的工作(它在第一行中混合了1525)。
您的代码既混乱又混乱。我对你的建议是:简化你的算法,在你的脑海里回顾(或使用纸张),如果它是带有打印数字的财政对象,你会怎么做。您可能会先拆分行,然后再用“:”分隔,最后才会被“拆分”。
https://stackoverflow.com/questions/25462198
复制相似问题