簡體   English   中英

如何從ArrayList獲取String值並將它們存儲在Java 8中用逗號分隔的單個字符串中?

[英]How to get String values from ArrayList and store them in a single string separated by commas, in Java 8?

我有一個帶有一些字符串的ArrayList。 我想將ArrayList中的數字列表存儲在由逗號分隔的單個字符串中,如下所示。

String s = "350000000000050287,392156486833253181,350000000000060764"

這是我的清單:

   List<String> e = new ArrayList<String>();

    e.add("350000000000050287");
    e.add("392156486833253181");
    e.add("350000000000060764");

我一直試圖通過以下方式實現:

     StringBuilder s = new StringBuilder();
    for (String id : e){

        s.append(id+",");

    }

唯一的問題是,這會在最后添加一個逗號,我不希望這樣。最好的方法是什么?

謝謝

最簡單的解決方案是使用String.join

List<String> list = new ArrayList<String>();

list.add("11");
list.add("22");
list.add("33");

String joined = String.join(",", list);

System.out.println(joined);
//prints "11,22,33"

請注意,這需要Java 8。


但是,如果要支持舊版本的Java,可以使用迭代器修復代碼:

StringBuilder sb = new StringBuilder();

Iterator<String> iterator = list.iterator();

// First time (no delimiter):
if (iterator.hasNext()) {
    sb.append(iterator.next());

    // Other times (with delimiter):
    while (iterator.hasNext()) {
        sb.append(",");
        sb.append(iterator.next());
    }
}

或者只是使用布爾值來確定第一次:

StringBuilder sb = new StringBuilder();

boolean firstTime = true;

for (String str : list) {

    if (firstTime) {
        firstTime = false;
    } else {
        sb.append(",");
    }

    sb.append(str);
}

但后者顯然不如使用迭代器比較每個方法生成的字節碼。 然而,正如Tagir Valeev指出的那樣,這可能不是真的:這個基准測試向我們表明,使用一個標志從10開始進行多次迭代會更加高效

如果有人能解釋為什么會這樣,我很高興知道。

為這個Java 8解決方案的Tim Upvote;)

如果您不使用JDK 8

   StringBuilder s = new StringBuilder();
    for (String id : e){

        s.append(id).append(",");

    }
   String result =s.toString().replaceAll(",$", "");

我使用",$"的正則表達式是檢測最后一個逗號。

如果你看到,我已經取代了s.append(id +","); with s.append(id).append(","); 為了更好的表現

您可以使用布爾標志來檢查第一次迭代,如果不是第一次迭代,則在追加id之前追加","

這可以解決您的問題。

boolean first = true;
for (String id : e){
    if(!first)
        s.append(",");
    else
        first = false;
    s.append(id);

}

注意

如果您使用Java8,請遵循Tim的解決方案。

嘗試通過檢查當前索引是列表的最后一個值(e.size-1)來迭代遍歷列表,如果它不是最后一個值,則將該字符串與“,”連接起來,如果是,則連接而不連接“”。

    List<String> e = new ArrayList<>(Arrays.asList("3333", "4444", "3333"));
    StringBuilder s = new StringBuilder();

    for (int i = 0; i < e.size(); i++) {
        s.append(e.get(i)).append((i == e.size() - 1) ? "" : ",");
    }
StringBuilder s = new StringBuilder();
for(int i = 0; i < e.size()-1; i++){
    s.append(e.get(i)+",")
}
s.append(e.get(i))

Collectors.joining(",")在您的情況下運行良好,示例實現:

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class Solution {
    public static void main(String[] args) {
        List<String> e = new ArrayList<>();
        e.add("350000000000050287");
        e.add("392156486833253181");
        e.add("350000000000060764");
        System.out.println(e.stream().collect(Collectors.joining(",")));
    }
}

輸出:

350000000000050287,392156486833253181,350000000000060764

如果我們談論Java 8,那么:

Collection<String> e = asList("a", "b", "c");

String result = e.stream().collect(Collectors.joining(",")); // a,b,c

此方法可以應用於任何字符串Collection ,以及String.join()

List<String> e = new ArrayList<String>();
    e.add("350000000000050287");
    e.add("392156486833253181");
    e.add("350000000000060764");
    Iterator iterator = e.iterator();
    String s="";
    int i = 1;
    while (iterator.hasNext()) {
        if (i == e.size()) {
            s =s+iterator.next();
        } else {
            s =s+iterator.next()+",";
        }
        i++;
    }
    System.out.println(s);

350000000000050287,392156486833253181,350000000000060764

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM