2013-04-04 70 views
95

Tôi có Set<String> result & muốn chuyển đổi chuỗi thành chuỗi được phân tách bằng dấu phẩy. Cách tiếp cận của tôi sẽ như hình dưới đây, nhưng cũng tìm kiếm ý kiến ​​khác.Cách tốt nhất để chuyển đổi danh sách thành chuỗi được phân tách bằng dấu phẩy trong java

List<String> slist = new ArrayList<String> (result); 
StringBuilder rString = new StringBuilder(); 

Separator sep = new Separator(", "); 
//String sep = ", "; 
for (String each : slist) { 
    rString.append(sep).append(each); 
} 

return rString; 
+0

'Separator' là gì? – kay

+0

Nếu ứng dụng của bạn liên quan đến Spring thì nó có một phương thức tiện ích [collectionToCommaDelimitedString] (http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/util/StringUtils.html#collectionToCommaDelimitedString% 28java.util.Collection% 29). Tôi sẽ không kéo thư viện chỉ cho điều đó, nhưng nếu bạn đang sử dụng nó đã ... –

+7

'List.toString' hiện nó đã, chỉ cần loại bỏ các ký tự cuối cùng và đầu tiên. –

Trả lời

287

Từ Apache thư viện Commons:

import org.apache.commons.lang3.StringUtils 

Sử dụng:

StringUtils.join(slist, ','); 

Một câu hỏi tương tự và trả lời here

+19

StringUtils từ Apache Commons Lang (http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/StringUtils.html#join(java.util.Iterator, char)) – Sigrist

+40

Bật Android, bạn có thể sử dụng TextUtils.join(). –

+1

Java không hỗ trợ dấu nháy đơn –

3

Các Separator bạn đang sử dụng là một thành phần giao diện người dùng. Bạn sẽ tốt hơn khi sử dụng đơn giản String sep = ", ".

6

Bạn có thể đếm tổng chiều dài của chuỗi đầu tiên và chuyển nó tới hàm tạo StringBuilder. Và bạn không cần phải chuyển đổi Set trước.

Set<String> abc = new HashSet<String>(); 
abc.add("A"); 
abc.add("B"); 
abc.add("C"); 

String separator = ", "; 
int total = abc.size() * separator.length(); 
for (String s : abc) { 
    total += s.length(); 
} 

StringBuilder sb = new StringBuilder(total); 
for (String s : abc) { 
    sb.append(separator).append(s); 
} 

String result = sb.substring(separator.length()); // remove leading separator 
+2

Lưu ý rằng nếu Set trống, StringBuilder.substring sẽ ném một ngoại lệ. – Nier

+1

Bạn phải chạy qua Chuỗi hai lần. Vì vậy, nó là một thuật toán N^2 hiệu quả. Các chuỗi thực sự dài sẽ thực hiện khủng khiếp, và tùy thuộc vào ứng dụng của bạn mở ra một vector tấn công DoS. – SoftwareSavant

+0

@Kay tôi làm rất nhiều. Một thuật toán có thời gian chạy tăng logarit như một hàm của số đối tượng mà nó hoạt động. Tại sao tôi tính toán bằng cách nào đó? Tôi có đọc sai mã của bạn không? trong đó bạn đi qua cùng một chuỗi 2 lần, đầu tiên đếm tổng số thứ hai để nối chuỗi và dấu tách. Hãy tưởng tượng thay vì một bộ ba bạn đã có một bộ 3 triệu? Bạn có thể tưởng tượng thời gian chạy của giải pháp đó là bao lâu? – SoftwareSavant

Các vấn đề liên quan