如何将arraylist转换成字符串?

时间:2013-12-17 09:28:28

标签: java arraylist

我是java的初学者。在我的代码中我有一个arraylist,我想完全输出为String。为此我写了这段代码。

package factorytest;

import java.util.ArrayList;
import java.util.List;

public class MatchingWord {

    public static void main(String[] args) {

        List <String> myList = new ArrayList<String>();
        myList.add("hello");
        myList.add("first");
        myList.add("second");
        myList.add("third");
        myList.add("fourth");

        // 1st approach
        String listString = "";

        for (String s : myList)
        {
            listString += s + "\t";
        }
System.out.println(listString);
    }

}

,我的输出是

hello   first   second  third   fourth  

我不希望最后一个元素之后的最后一个\ t。我怎样才能做到这一点。

12 个答案:

答案 0 :(得分:5)

一个解决方案是不使用 for-each 循环,您可以执行以下操作:

int i;
for(i = 0;i < myList.size() - 1;i++) {
    listString += myList.get(i) + "\t";
}
listString += myList.get(i);

我建议您使用StringBuilder代替+

其他解决方案:

  • 完成构建后修剪字符串。
  • 使用Joiner
  • ...

答案 1 :(得分:3)

你有2个解决方案:

  • 明确使用迭代器。
  • 使用Guava Joiner(外部库,您需要导入它)。

迭代器

Iterator<String> it = myList.iterator();

while(it.hasNext()) {
   listString += it.next();

   if(it.hasNext()) {
     listString += "\t";
   }
}

Joiner

Joiner j = Joiner.on("\t);
System.out.println(j.join(myList));

提示:您还应该考虑使用StringBuilder而不是String + =

答案 2 :(得分:3)

使用trim()。

for (String s : myList)
{
    listString += s + "\t";
}

listString = listString.trim();
System.out.println(listString);

答案 3 :(得分:2)

如果是为了调试,为什么不使用:

System.out.println(myList.toString());

答案 4 :(得分:2)

您可以使用“调试”

myList.toString();

您可以使用仅为某些修改提供的相同代码

for (int i=0; i<myList.size(); i++)
{
    if (i == myList.size()-1)
        listString += s;
    else
        listString += s + "\t";
}

trim()不起作用......

答案 5 :(得分:2)

有很多方法可以解决这个问题!我通常会使用通常的for loop with an index并将尾随字符添加到n-1位置。但今天我决定运行几个快速测试,看看哪种方法更快,这是我的结果:

(另外,我假设 - 相信 - StrinBuffer .append()的摊销时间为O(1)。)

使用的方法:For循环,Foreach循环和迭代器

1)For loop

private static String getStringWithForIndex(ArrayList<String> stringArray){
    StringBuffer buffer = new StringBuffer(); //O(1)
    int index;  //O(1)
    for(index=0; index<stringArray.size()-1; ++index){  //In all O(n)
        buffer.append(stringArray.get(index));
        buffer.append("\n");
    }   
    buffer.append(stringArray.get(index));  //O(1);

    return buffer.toString(); O(n)
}

有一件事我刚才意识到,我可以通过将stringArray.size()-1调用保存到变量而不是多次调用它来加速这个循环(我的坏!)。除此之外,我认为这个循环中最糟糕的部分是stringArray.get(index),因为所使用的其余代码都与StringBuffer有关,而StringBuffer也用在其他循环中。

尽管如此,它应该不是坏事,因为.get()是常量时间,O(1)。

2)Foreach循环

private static String getStringWithForEach(ArrayList<String> stringArray){
    StringBuffer buffer = new StringBuffer();  //O(1)
    for(String word : stringArray){   // In all O(n)
        buffer.append(word);
        buffer.append("\n");
    }

    buffer.deleteCharAt(buffer.length()-1); 
    //O(1) because IT'S THE LAST CHARACTER ALWAYS

    return buffer.toString(); //O(n)
}

3)使用Iterator

private static String getStringWithIterator(ArrayList<String> stringArray){ 
    Iterator it = stringArray.iterator(); //O(1)
    StringBuffer buffer = new StringBuffer(); //O(1)
    while(it.hasNext()){ //In all O(n)
        buffer.append(it.next());
        if(it.hasNext())
            buffer.append("\n");
    }

    return buffer.toString(); //O(n)
}

可能的时间问题?对it.hasNext()的双重质疑。但是,它在性能方面不应该是一个问题,因为如果你看看hasNext()中涉及的由ArrayList返回的Iterator的代码,你会发现它只是一个比较,所以它将是O( 1)时间。

public boolean hasNext() {
        return cursor != size; 
}

<强>结论

理论上,所有循环最终都具有O(n)时间复杂度。根据所做的比较,它们会略有不同,但差别不大。这意味着您可以选择您想要的任何方法而不必担心性能,因此您可以选择最佳或最适合您的代码。那不是很好吗?

以下是一些支持该理论的快速测试。

结果 的 以秒为单位测量。

test1 62.9kb

With Iterator: 0.003 
With Foreach: 0.007 
With ForIndex: 0.002


With Iterator: 0.008
With Foreach: 0.009
With ForIndex: 0.002


With Iterator: 0.004
With Foreach: 0.015
With ForIndex: 0.002

With Iterator: 0.007
With Foreach: 0.008
With ForIndex: 0.003

With Iterator: 0.003
With Foreach: 0.003
With ForIndex: 0.002

With Iterator: 0.006
With Foreach: 0.01
With ForIndex: 0.002

*Average* With Iterator: 0.006
*Average* With Foreach: 0.009
*Average* With ForIndex: 0.002

test2 6.4 mb

With Iterator: 0.102
With Foreach: 0.115
With ForIndex: 0.121

With Iterator: 0.104
With Foreach: 0.109
With ForIndex: 0.118

With Iterator: 0.106
With Foreach: 0.123
With ForIndex: 0.126

With Iterator: 0.099
With Foreach: 0.109
With ForIndex: 0.12

With Iterator: 0.098
With Foreach: 0.109
With ForIndex: 0.119

With Iterator: 0.1
With Foreach: 0.119
With ForIndex: 0.122

*Average* With Iterator: 0.102
*Average* With Foreach: 0.114
*Average* With ForIndex: 0.121

test3 47 mb

With Iterator: 0.116
With Foreach: 0.137
With ForIndex: 0.131

With Iterator: 0.118
With Foreach: 0.146
With ForIndex: 0.119

With Iterator: 0.115
With Foreach: 0.125
With ForIndex: 0.137

With Iterator: 0.11
With Foreach: 0.111
With ForIndex: 0.145

With Iterator: 0.096
With Foreach: 0.108
With ForIndex: 0.113

With Iterator: 0.096
With Foreach: 0.102
With ForIndex: 0.115

*Average* With Iterator: 0.108
*Average* With Foreach: 0.122
*Average* With ForIndex: 0.127

ps:我不得不将测试结果放在“代码块”中,因为出于某些样式原因,它们只显示在一行中? :S

答案 6 :(得分:1)

来自apache commons(http://commons.apache.org/proper/commons-lang/)。下载并用作外部jar lib。

System.out.println(StringUtils.join(myList, '\t'));

答案 7 :(得分:1)

使用trim()方法:

System.out.print(listString.trim());

答案 8 :(得分:0)

因为您有一个尾随\t字符,所以您需要在打印该行之前删除最后一个字符。请参阅此代码示例:

if (!listString.isEmpty) {
    listString = listString.substring(0, str.length()-1);
}

因此,请在System.out.println(listString)语句正上方插入。

答案 9 :(得分:0)

您可以使用:

 int index = 0;
  for (String s : myList)
    {
         if(index!=(myList.size-1))
         listString += s + "\t";

         else
         listString += s;   

         index++; 
    }

仅在最后一次迭代中,它不会添加标签空间。

答案 10 :(得分:0)

使用StringUtils.join()方法。

答案 11 :(得分:0)

使用:

String listString="";
        for(int i=0;i<list.size()-1;i++) {
            listString += list.get(i) + "\t";
        }
        listString += list.get(list.size()-1);

另外使用String类而不是使用StringBuilder对象来节省内存。 示例:

StringBuilder listString=new StringBuilder();
            for(int i=0;i<list.size()-1;i++) {
                listString.append(list.get(i) + "\t");
            }
            listString.append(list.get(list.size()-1));