从文件收集信息到Map <k,v =“”> </k,>

时间:2014-08-23 13:02:36

标签: java

我有一个包含以下内容的文档:

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)

2 个答案:

答案 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;
}