首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从文件收集信息到Map<K,V>

从文件收集信息到Map<K,V>
EN

Stack Overflow用户
提问于 2014-08-23 13:02:36
回答 2查看 72关注 0票数 1

我有一份文件,里面有这样的内容:

32:{ 15、25、65 }

43:{ 90,45,12 }

65:{ 50 }

我想映射这些字符串,我试着:

代码语言:javascript
复制
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());
         }
     }
}

参考方法:

代码语言:javascript
复制
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“,如

代码语言:javascript
复制
map.entrySet().forEach(Operator::print);

Operator.print方法->

代码语言:javascript
复制
public static void print(Object o)
{
    System.out.print(o);
}

但是,输出是一个例外。Out ->

代码语言:javascript
复制
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)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-23 13:46:23

或者,您可以使用正则表达式来匹配它,然后可以使用第二个组上的拆分来获取每个条目的整数组。

代码语言:javascript
复制
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;
}
票数 -1
EN

Stack Overflow用户

发布于 2014-08-23 13:51:55

你的算法上有个错误。我将您的代码复制到我的IDE中,并成功地重新创建了相同的错误。问题是第三次呼叫removeUntil()。进一步的分析表明,removeUntil正在试图找到不存在于其中的数字52的工作(它在第一行中混合了1525)。

您的代码既混乱又混乱。我对你的建议是:简化你的算法,在你的脑海里回顾(或使用纸张),如果它是带有打印数字的财政对象,你会怎么做。您可能会先拆分行,然后再用“:”分隔,最后才会被“拆分”。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25462198

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档