Java 列表仅存储最后添加的值
我对以下代码有问题: 首先,我有一个内部类:Java 列表仅存储最后添加的值,java,Java,我对以下代码有问题: 首先,我有一个内部类: public class TraceMessage{ private String messageType; private String tracedIdentifier; private List<String> content; TraceMessage(){ content = new ArrayList<String>();
public class TraceMessage{
private String messageType;
private String tracedIdentifier;
private List<String> content;
TraceMessage(){
content = new ArrayList<String>();
messageType="";
tracedIdentifier="";
}
TraceMessage(String messageType, String identifier ,List<String> content){
this.messageType = messageType;
this.tracedIdentifier = identifier;
this.content = content;
}
其中temp是TraceMessage对象
所以我的问题是,当我向列表中添加这样的消息类型对象时,值很好,我甚至将printout输出到构造函数中,它也显示了良好的值。但后来当我试图使用该列表时,列表中的所有元素都有相同的内容(最后一个)。有什么问题吗
以下是我添加消息的完整部分:
private List<TraceMessage> messages = new ArrayList<TraceMessage>();
String fileName="tracefile.MTR";
BufferedReader br = new BufferedReader(new FileReader(fileName));
try {
String line;
TraceMessage temp = new TraceMessage();
while ((line=br.readLine()) != null) {
if(line.contains("MSCi")){
temp.content.clear();
temp.content.add(line);
}
else if(line.contains("CALL PHASE")){
temp.messageType = line.substring(60);
temp.content.add(line);
}
else if(line.contains("CALL ID")){
temp.tracedIdentifier = line.substring(22);
temp.content.add(line);
}
else if(line.contains("END OF REPORT")){
temp.content.add(line);
messages.add(new TraceMessage(temp.messageType,temp.tracedIdentifier,temp.content));
}
else{
temp.content.add(line);
}
}
} finally {
br.close();
}
我会重写第二个构造函数来复制列表
TraceMessage(String messageType, String identifier ,List<String> content){
this.messageType = messageType;
this.tracedIdentifier = identifier;
this.content = new ArrayList<String>(content);
}
TraceMessage(字符串消息类型、字符串标识符、列表内容){
this.messageType=messageType;
this.traceIdentifier=标识符;
this.content=新的ArrayList(content);
}
这将复制您在
循环中重复使用的临时内容。实例将不会在类外对内容集合执行操作。putTraceMessage temp=new-TraceMessage()代码>
在while循环中
并更改messages.add(新的TraceMessage(临时消息类型、临时TraceIdentifier、临时内容))代码>
到
消息。添加(临时)代码>
好吧,如果你不能做到的话
替换messages.add(新的TraceMessage(临时消息类型、临时TraceIdentifier、临时内容))代码>
具有
消息。添加(临时);消息=新的TraceMessage()代码>如下更改代码:
...
try {
String line;
List<String> content = new ArrayList<String>();
String messageType = "";
String tracedIdentifier = "";
while ((line=br.readLine()) != null) {
if (line.contains("MSCi")){
content.clear();
content.add(line);
}
else if (line.contains("CALL PHASE")) {
messageType = line.substring(60);
content.add(line);
}
else if (line.contains("CALL ID")) {
tracedIdentifier = line.substring(22);
content.add(line);
}
else if (line.contains("END OF REPORT")) {
content.add(line);
messages.add(new TraceMessage(messageType, tracedIdentifier, content);
}
else {
content.add(line);
}
}
} finally {
br.close();
}
。。。
试试{
弦线;
列表内容=新建ArrayList();
字符串messageType=“”;
字符串TraceIdentifier=“”;
而((line=br.readLine())!=null){
如果(第行包含(“MSCi”)){
content.clear();
内容。添加(行);
}
else if(行包含(“呼叫阶段”)){
messageType=line.substring(60);
内容。添加(行);
}
else if(行包含(“调用ID”)){
TraceIdentifier=行子字符串(22);
内容。添加(行);
}
else if(第行包含(“报告结束”)){
内容。添加(行);
添加(新的TraceMessage(messageType、TraceIdentifier、content);
}
否则{
内容。添加(行);
}
}
}最后{
br.close();
}
不要使用temp
对象,而是将属性保存在外部变量中(不在while循环中)然后用这些变量将一个新对象添加到消息列表中。如果temp
已经是TraceMessage
对象,为什么不直接将其添加到消息列表中?:消息。添加(temp)
问题很可能是您没有在这里向我们展示真实的代码,并且您实际上多次添加了相同的对象。您能给我们展示一个复制问题的自包含测试吗?您总是得到相同的对象温度。@maqjav我怀疑这就是问题所在。我添加了您要求的代码部分。内容没有当我添加相同的值时,我确信我在添加之前打印了它,它显示了正确的值我不能真正将它放入循环中,因为如果我将它放入其中一个块(if/else),其他块就看不到它
...
try {
String line;
List<String> content = new ArrayList<String>();
String messageType = "";
String tracedIdentifier = "";
while ((line=br.readLine()) != null) {
if (line.contains("MSCi")){
content.clear();
content.add(line);
}
else if (line.contains("CALL PHASE")) {
messageType = line.substring(60);
content.add(line);
}
else if (line.contains("CALL ID")) {
tracedIdentifier = line.substring(22);
content.add(line);
}
else if (line.contains("END OF REPORT")) {
content.add(line);
messages.add(new TraceMessage(messageType, tracedIdentifier, content);
}
else {
content.add(line);
}
}
} finally {
br.close();
}