gpt4 book ai didi

Java 字符串值与子字符串后的文本不匹配

转载 作者:行者123 更新时间:2023-12-01 15:16:49 25 4
gpt4 key购买 nike

遇到了一些奇怪的问题。我有以下代码来对字符串进行一些基本解析:

    for (int i = 0; i < lines.size(); i++) {
String line = lines.get(i);

//get time
int firstWhiteSpace = line.indexOf(" ");
String time = line.substring(0, firstWhiteSpace);

//problem is here vvvv
line = line.substring(firstWhiteSpace + 1, line.length());
//problem is here ^^^^

//get client
int firstColon = line.indexOf(":");
String client = line.substring(0, firstColon);
line = line.substring(firstColon + 1, line.length());

ChatMessage chatMessage = new ChatMessage();
chatMessage.setTime(time);
chatMessage.setClient(client);
chatMessage.setMessage(line);

messages.add(chatMessage);
}

所以基本上在我执行 line = line.substring(a, b) 之后,我希望得到 a (包括)和 之间的 line 子字符串b(独占)。但是,如果我打印 line ,我会在执行子字符串操作之前获取整个字符串。奇怪的是,如果我查看调试器(Eclipse),那么字符串的值是子字符串,但字符数组包含整个字符串。

例如,如果:

line = "Hello World"

我愿意:

line = line.substring(0, 5);

那么该行现在的值为:

"Hello"

但是字符数组是:

[H, e, l, l, o, , W, o, r, l, d]

所以,我有点困惑。如果我错过了一些愚蠢的事情,我深表歉意。这是很有可能的。

完整的代码,它不是一个非常复杂的类:

公共(public)类 ChatParser { 私有(private)静态 TS3ParserSettings 设置;

public static void main(String[] args) {
ChatParser.setSettings("C:/Users/*****/javaWorkspace/TS3Parser/src/data/settings.txt");
ChatParser.parseChat();
}

public static void parseChat() {
ArrayList<String> lines = TextParser.parseTextLines(settings.getSetting("chatLogPath"));
ArrayList<ChatMessage> messages = new ArrayList<ChatMessage>();

for (int i = 0; i < lines.size(); i++) {
String line = lines.get(i);

//get time
int firstWhiteSpace = line.indexOf(" ");
String time = line.substring(0, firstWhiteSpace);
line = line.substring(firstWhiteSpace + 1, line.length());

//get client
int firstColon = line.indexOf(":");
String client = line.substring(0, firstColon);
line = line.substring(firstColon + 1, line.length());

ChatMessage chatMessage = new ChatMessage();
chatMessage.setTime(time);
chatMessage.setClient(client);
chatMessage.setMessage(line);

messages.add(chatMessage);
}

for (int i = 0; i < messages.size(); i++) {
System.out.println("TIME = " + messages.get(i).getTime() + " CLIENT = " + messages.get(i).getClient() + " MESSAGE = " + messages.get(i).getMessage());
}
}

public static void setSettings(String path) {
settings = SettingsParser.parseSettings(path);
}
}

最佳答案

由于String对象是不可变的,编译器可以自由地共享底层数据。当您执行 substring() 时,您将创建一个新的 String 引用对象,该对象指向原始字符串数组,但具有不同的起始偏移量和长度。

对于第一个例子,打印出firstWhiteSpace的值,我想一切都会清楚了。

关于Java 字符串值与子字符串后的文本不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11494585/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com