【问题标题】:How to get toString for each element of an ArrayList?如何为 ArrayList 的每个元素获取 toString?
【发布时间】:2016-07-10 01:01:33
【问题描述】:

我有这个类的构造函数以一个字符串和一个数组列表作为参数;

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 类中有什么事情要做吗?

【问题讨论】:

  • 不清楚你想在这里做什么。您是否要遍历数组中的所有元素并打印出它们的 toString() 值?
  • 你想通过迭代值来编写Foo.toString()还是你想覆盖ArrayList的toString?看看:stackoverflow.com/questions/18129505/…

标签: java list arraylist


【解决方案1】:

首先,强烈建议远离原始类型。 List 是泛型类型,所以你应该把它当作泛型类型使用。

那么,你要做的只是一个join操作。如果您使用的是 Java 8,则可以这样做

list.stream().collect(Collectors.joining(" -> "))

在普通的旧 Java 中,您可以这样做

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

【讨论】:

    【解决方案2】:

    您需要从 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();
    }
    

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

    【讨论】:

    • 重复执行以聚合结果时,字符串连接很慢。 StringBuilder 更快。此外,您的代码将因空列表而失败
    • Java 编译器处理从 + 运算符到 StringBuilder 的转换已经有一段时间了,如果它提高了性能的话。 docs.oracle.com/javase/specs/jls/se8/html/…。是的,如果列表为空,此代码将失败。这就是为什么我说“会是这样的”;)
    • 你不应该依赖编译器来代替你编写好的代码。另外,你错了。编译器将在单个表达式中优化a + b + c,但不会(或可能不会,取决于实现)针对具有多次重新分配的连续语句进行优化。我会创建一个 sn-p 来证明给你看
    • 我的错,我自己试过了。我认为即使没有单一的表达它也会起作用。无论如何,我同意依赖编译器不是一个好主意的事实。这只是一个简单的例子,比 StringBuilder 更容易理解。
    • 对。下次会记得(我刚刚开始回答)
    【解决方案3】:

    您需要在 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();
        }
    

    【讨论】:

    • 空列表不是特殊情况,因为它永远不会进入循环。此外,对于非并发使用,StringBuider 优于 StringBuffer。最后,您将在字符串末尾使用分隔符,这是不受欢迎的(类似于item1 sep item2 sep item3 sep
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多