0

I am trying to write a getMessageList method that converts the message List to strings and returns it. However, the toString method is not actually converting the members of the list to a string.

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);
    }

}

My 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;
    }

The output

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

Federico klez Culloca
  • 26,308
  • 17
  • 56
  • 95

1 Answers1

0

toString

The custom(or even library provided) object that needs a textual representation has to override the toString() being inherited from the Object class.

Current example

Assuming the list will be referenced as List<LogMessage> and LogMessage has toString overridden, the follow will return the String array

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

Or even if you need a generic method(assuming the type overrides toString), then

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

Or, if the input can contain null and can be of any type,

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

Or, if its a public interface and the list itself can be null,

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);
}

Without overriding toString, the toString will use the Object.toString.

Thiyanesh
  • 2,360
  • 1
  • 4
  • 11