Java 如何为ArrayList的每个元素获取toString?

Java 如何为ArrayList的每个元素获取toString?,java,list,arraylist,Java,List,Arraylist,我让这个类有一个以字符串和Arraylist为参数的构造函数 class Foo{ String ide; ArrayList list; public TypeOperator(String ide, ArrayList list){ this.ide = ide; this.list = list; } } 因此,当我初始化类时,如下所示: ArrayList<SomeType> list = new Array

我让这个类有一个以字符串和Arraylist为参数的构造函数

class Foo{
    String ide;
    ArrayList list;

    public TypeOperator(String ide, ArrayList list){
        this.ide = ide;
        this.list = list;
    }
}
因此,当我初始化类时,如下所示:

ArrayList<SomeType> list = new ArrayList<Some Type>;
list.add(SomeType1);
list.add(SomeType2);
Foo one = new Foo("->", list);
SomeType 2 -> SomeType 1

比如说我有一个SomeType类。我在SomeType课上有什么事要做吗

您需要在Foo类中创建一个toElementString方法

 public String toElementString(){
        if(list == null || list.size() == 0) return "";
        StringBuffer buffer = new StringBuffer();
        int size = list.size();
        for(int i = 0; i < size;i++){
            buffer.append(list.get(i));
            if(i != (size - 1)){
                buffer.append(" ");
                buffer.append(ide);
                buffer.append(" ");
            }
        }
        System.out.println(buffer.toString());
        return buffer.toString();
    }
公共字符串到元素字符串(){
if(list==null | | list.size()==0)返回“”;
StringBuffer=新的StringBuffer();
int size=list.size();
对于(int i=0;i
首先,强烈建议远离原始类型<代码>列表是泛型类型,因此应将其用作泛型类型

那么,您想要做的仅仅是一个连接操作。如果您使用的是Java8,您可以

list.stream().collect(Collectors.joining(" -> "))
StringBuilder sb = new StringBuilder();
Iterator<T> it = list.iterator();

if (it.hasNext()) sb.append(it.next());
while (it.hasNext()) {
    sb.append(" -> ").append(it.next());
}
String result = sb.toString();
在普通的旧Java中,您可以

list.stream().collect(Collectors.joining(" -> "))
StringBuilder sb = new StringBuilder();
Iterator<T> it = list.iterator();

if (it.hasNext()) sb.append(it.next());
while (it.hasNext()) {
    sb.append(" -> ").append(it.next());
}
String result = sb.toString();
StringBuilder sb=新建StringBuilder();
Iterator it=list.Iterator();
如果(it.hasNext())某人追加(it.next());
while(it.hasNext()){
sb.append(“->”).append(it.next());
}
字符串结果=sb.toString();

您需要从Foo实现toString()方法,该方法类似于:

public String toString(){
    String result  = "" ;
    for(int  i = list.size()-1;i>0;i--){
        result = result+ list.get(i).toString() + " " + ide + " ";
    }
    result = result + list.get(0).toString();
    return result;
}
或者,如Dici所指出的,性能更好:

    public String toString(){


    StringBuilder result  = new StringBuilder() ;
    if (!list.isEmpty()){
        for(int  i = list.size()-1;i>0;i--){
            result.append(list.get(i).toString()).append(" ").append(ide).append(" ");
        }
        result.append(list.get(0).toString());
    }
    return result.toString();
}

然后按照您想要显示某个类型的方式,您可能必须实现它自己的toString方法。

这里不清楚您想要做什么。是否要迭代数组中的所有元素并打印出它们的toString()值?是要通过迭代值来编写Foo.toString(),还是要重写ArrayList的toString?看看:空列表不是特例,因为它永远不会进入循环。另外,对于非并发使用,
StringBuffer
优于
StringBuffer
。最后,您将在字符串末尾使用分隔符,这是不需要的(类似于
item1-sep-item2-sep-item3-sep
)字符串连接在重复聚合结果时速度较慢<代码>StringBuilder的速度要快得多。此外,如果代码的列表为空,那么代码将失败。java编译器已经有一段时间没有处理从+运算符到StringBuilder的转换了,如果它能提高性能的话。是,如果列表为空,此代码将失败。这就是为什么我说“会有点像”;)你不应该依靠编译器来代替你编写好的代码。另外,你错了。编译器将在单个表达式中优化
a+b+c
,但不会(或可能不会,取决于实现)对具有多次重新分配的连续语句进行优化。我将创建一个片段来向你证明我的错,我自己尝试过。我认为即使没有一个表达式,它也能工作。无论如何,我同意依赖编译器不是一个好主意这一事实。这只是一个简单的示例,比StringBuilder.Right更容易理解。下次会记得的(我刚开始回答)