Java string.length无法按预期工作

时间:2016-12-01 12:07:08

标签: java arrays string bufferedreader

我有一个包含以下格式的数据的文件:

12345foo \n
24561bar \n
12783apples \n ect.

为了处理这些数据,我正在使用bufferedreader将其读入程序,并使用以下代码将其放入2D数组中:

line = bRead.readLine();
2DArray[x][y] = line.substring(0,5);
2DArray[x][z] = line.substring(5,line.length());

我不确定为什么line.length显然在这个例子中给了我(line.length() - 5)

3 个答案:

答案 0 :(得分:0)

你应该这样做:

line.substring(5);

https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#substring(int)

public static void main(String[] args) {

    BufferedReader bR = null;

    try {
        bR = new BufferedReader(new FileReader("teste.txt"));

        Map<String, String> txt = new HashMap<String, String>();
        String line;

        while ((line = bR.readLine()) != null) {
            txt.put(line.substring(0, 5), line.substring(5));
        }

        txt.forEach((k, v) -> System.out.println(k + " - " + v));

    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (bR != null) {
            try {
                bR.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

Output:

24561 - bar
12345 - foo
12783 - apples

答案 1 :(得分:0)

如果我必须批准并审核您的代码,我的第一个问题是“您为什么使用数组?”将逻辑上属于一起分成2D阵列或Map的数据拆分是我认为不好的代码。您显然有一个带有ID和名称的订单项,因此您应该拥有此类对象的域模型。 这就是我要做的。

package com.example

import java.io.BufferedReader;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;

public class Main {

    public static void main(String[] args) throws Exception {

        String data = "12345foo\n" +
                      "24561bar\n" +
                      "12783apples\n";

        BufferedReader br = new BufferedReader(new StringReader(data));
        String line = null;
        List<LineItem> items = new ArrayList<>();
        while (null != (line = br.readLine())) {
            int id = Integer.parseInt(line.substring(0, 5));
            String name = line.substring(5);
            items.add(new LineItem(id, name));
        }

        items.forEach(lineItem -> System.out.println(lineItem));

    }

    public static class LineItem {
        private final int id;
        private final String name;

        public LineItem(int id, String name) {
            this.id = id;
            this.name = name;
        }

        @Override
        public String toString() {
            return "LineItem{" +
                    "id=" + id +
                    ", name='" + name + '\'' +
                    '}';
        }
    }
}

答案 2 :(得分:0)

在java中,line.substring()使用第一个paramiter来确定从开始的偏移量,并使用第二个paramiter来确定从开始的偏移量。例如,

String foo = "barAndSomeOtherStuff"; System.out.print(foo.substring (5, 12));

输出&#34; dSomeOt&#34;,而不是&#34; dSomeOtherSt。&#34;

这样的问题的一个好主意是在你来到像StackOverflow这样的地方之前检查文档!