Cách rõ ràng nhất để phân tách danh sách bằng dấu phẩy trong Java là gì?
Tôi biết một số cách để làm điều đó, nhưng tôi đang tự hỏi cách tốt nhất là gì (trong đó "tốt nhất" có nghĩa là rõ ràng nhất và / hoặc ngắn nhất, không phải là hiệu quả nhất.
Tôi có một danh sách và tôi muốn lặp lại nó, in từng giá trị. Tôi muốn in dấu phẩy giữa mỗi mục, nhưng không in sau mục cuối cùng (cũng không phải trước mục đầu tiên).
List --> Item ( , Item ) *
List --> ( Item , ) * Item
Giải pháp mẫu 1:
boolean isFirst = true;
for (Item i : list) {
if (isFirst) {
System.out.print(i); // no comma
isFirst = false;
} else {
System.out.print(", "+i); // comma
}
}
Giải pháp mẫu 2 - tạo danh sách phụ:
if (list.size()>0) {
System.out.print(list.get(0)); // no comma
List theRest = list.subList(1, list.size());
for (Item i : theRest) {
System.out.print(", "+i); // comma
}
}
Giải pháp mẫu 3:
Iterator<Item> i = list.iterator();
if (i.hasNext()) {
System.out.print(i.next());
while (i.hasNext())
System.out.print(", "+i.next());
}
Những thứ này đặc biệt coi trọng mặt hàng đầu tiên; thay vào đó người ta có thể đối xử đặc biệt với người cuối cùng.
Ngẫu nhiên, đây là cách List
toString
được triển khai (nó được kế thừa từ AbstractCollection
), trong Java 1.6:
public String toString() {
Iterator<E> i = iterator();
if (! i.hasNext())
return "[]";
StringBuilder sb = new StringBuilder();
sb.append('[');
for (;;) {
E e = i.next();
sb.append(e == this ? "(this Collection)" : e);
if (! i.hasNext())
return sb.append(']').toString();
sb.append(", ");
}
}
Nó thoát khỏi vòng lặp sớm để tránh dấu phẩy sau mục cuối cùng. BTW: đây là lần đầu tiên tôi nhớ lại thấy "(Bộ sưu tập này)"; đây là mã để kích động nó:
List l = new LinkedList();
l.add(l);
System.out.println(l);
Tôi hoan nghênh bất kỳ giải pháp nào, ngay cả khi họ sử dụng các thư viện không mong muốn (regexp?); và cả các giải pháp bằng các ngôn ngữ khác ngoài Java (ví dụ: tôi nghĩ Python / Ruby có một hàm xen kẽ - điều đó được thực hiện như thế nào?).
Làm rõ : theo các thư viện, ý tôi là các thư viện Java tiêu chuẩn. Đối với các thư viện khác, tôi xem xét chúng với các ngôn ngữ khác và muốn biết chúng được triển khai như thế nào.
Bộ công cụ EDIT đã đề cập đến một câu hỏi tương tự: Lần lặp cuối cùng của vòng lặp for nâng cao trong java
Và một điều khác: Phần tử cuối cùng trong một vòng lặp có xứng đáng được xử lý riêng không?