我是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。我怎样才能做到这一点。
答案 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个解决方案:
迭代器:
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));