【问题标题】:Unable to convert elements of ArrayList to String [duplicate]无法将 ArrayList 的元素转换为字符串 [重复]
【发布时间】:2024-04-24 17:10:02
【问题描述】:

我正在尝试编写一个 getMessageList 方法,将消息列表转换为字符串并返回它。但是,toString 方法实际上并没有将列表的成员转换为字符串。

Main.java

import java.util.ArrayList;
import java.util.List;;
public class Main {

    public static void main(String[] args) {
    List<LogMessage> ln = new ArrayList <LogMessage>();
    ln.add(new LogMessage("SERVER1:file not found"));
    ln.add(new LogMessage("SERVER2:disk"));
    ln.add(new LogMessage("SERVER3:not found disk"));
    ln.add(new LogMessage("SERVER4:disk/found"));
    ln.add(new LogMessage("SERVER5:Disk found"));
    ln.add(new LogMessage("SERVER6:no/disk found"));
    ln.add(new LogMessage("SERVER7:no disk/found"));
    ln.add(new LogMessage("SERVER8:no disk found"));
    ln.add(new LogMessage("SERVER9:not found/disk"));
    ln.add(new LogMessage("SERVER10:not found disk"));

    for(LogMessage lnsg : ln) {
        System.out.println(lnsg.getDescription() + " => " + lnsg.getmachineId());
        System.out.println("containsWord = " + lnsg.containsWord("disk"));
    }
    
    SystemLog s1 = new SystemLog(ln);
    System.out.println( s1.getMessageList(ln));
    System.out.println("messageList Size: " + s1.getMessageList(ln).length);
    System.out.println("remove list " + s1.removeMessages("disk"));
    System.out.println("message List " + s1.getMessageList(ln));
    System.out.println("messageList Size: " + s1.getMessageList(ln).length);
    }

}

我的getMessageList

    public String[] getMessageList(List a) {
        String[] messagelist = new String[a.size()];
        
        for(int i = 0; i < a.size();i++) {
            System.out.println("a.get(i): " + a.get(i)); //test
            System.out.println("a.get(i).toString: " + a.get(i).toString()); //test
            messagelist[i] = a.get(i).toString();
        }
        return messagelist;
    }

输出

a.get(i): LogMessage@33909752
a.get(i).toString: LogMessage@33909752
a.get(i): LogMessage@55f96302
a.get(i).toString: LogMessage@55f96302
a.get(i): LogMessage@3d4eac69
a.get(i).toString: LogMessage@3d4eac69
a.get(i): LogMessage@42a57993
a.get(i).toString: LogMessage@42a57993
a.get(i): LogMessage@75b84c92
a.get(i).toString: LogMessage@75b84c92
a.get(i): LogMessage@6bc7c054
a.get(i).toString: LogMessage@6bc7c054
a.get(i): LogMessage@232204a1
a.get(i).toString: LogMessage@232204a1
a.get(i): LogMessage@4aa298b7
a.get(i).toString: LogMessage@4aa298b7
a.get(i): LogMessage@7d4991ad
a.get(i).toString: LogMessage@7d4991ad
a.get(i): LogMessage@28d93b30
a.get(i).toString: LogMessage@28d93b30
[Ljava.lang.String;@1b6d3586
a.get(i): LogMessage@33909752
a.get(i).toString: LogMessage@33909752
a.get(i): LogMessage@55f96302
a.get(i).toString: LogMessage@55f96302
a.get(i): LogMessage@3d4eac69
a.get(i).toString: LogMessage@3d4eac69
a.get(i): LogMessage@42a57993
a.get(i).toString: LogMessage@42a57993
a.get(i): LogMessage@75b84c92
a.get(i).toString: LogMessage@75b84c92
a.get(i): LogMessage@6bc7c054
a.get(i).toString: LogMessage@6bc7c054
a.get(i): LogMessage@232204a1
a.get(i).toString: LogMessage@232204a1
a.get(i): LogMessage@4aa298b7
a.get(i).toString: LogMessage@4aa298b7
a.get(i): LogMessage@7d4991ad
a.get(i).toString: LogMessage@7d4991ad
a.get(i): LogMessage@28d93b30
a.get(i).toString: LogMessage@28d93b30
messageList Size: 10
remove list [LogMessage@55f96302, LogMessage@3d4eac69, LogMessage@42a57993, LogMessage@6bc7c054, LogMessage@232204a1, LogMessage@4aa298b7, LogMessage@7d4991ad, LogMessage@28d93b30]
a.get(i): LogMessage@33909752
a.get(i).toString: LogMessage@33909752
a.get(i): LogMessage@75b84c92
a.get(i).toString: LogMessage@75b84c92
message List [Ljava.lang.String;@4554617c
a.get(i): LogMessage@33909752
a.get(i).toString: LogMessage@33909752
a.get(i): LogMessage@75b84c92
a.get(i).toString: LogMessage@75b84c92
messageList Size: 2

【问题讨论】:

  • 欢迎来到 SO。请尽量不要在您的问题中添加填充物。如果您的问题包含太多代码,那么请想办法缩短它。这使问题更有吸引力,更容易回答。
  • LogMessage 是否覆盖 toString 方法?
  • 也发布您的LogMessage 方法

标签: java string arraylist methods


【解决方案1】:

toString

需要文本表示的自定义(甚至是提供的库)对象必须覆盖从 Object 类继承的 toString()

当前示例

假设列表将被引用为 List&lt;LogMessage&gt; 并且 LogMessage 已覆盖 toString,以下将返回 String 数组

public String[] getMessageList(List<LogMessage> list) {
  return list.stream().map(e -> e.toString()).toArray(String[]::new);
}

或者即使你需要一个泛型方法(假设类型覆盖toString),那么

String[] getAsStringArray(List<T> list) {
  return list.stream().map(e -> e.toString()).toArray(String[]::new);
}

或者,如果输入可以包含null 并且可以是任何类型,

String[] getAsStringArray(List<?> list) {
  return list.stream().filter(Objects::nonNull).map(e -> e.toString()).toArray(String[]::new);
}

或者,如果它是一个公共接口并且列表本身可以为空,

public String[] getAsStringArray(List<?> list) {
  if (list == null) {
    return new String[0];
  }
  return list.stream().filter(Objects::nonNull).map(e -> e.toString()).toArray(String[]::new);
}

如果不覆盖toStringtoString 将使用Object.toString

【讨论】:

    最近更新 更多