Tôi muốn tham gia String[]
với một chuỗi keo. Có một chức năng cho điều này?
Tôi muốn tham gia String[]
với một chuỗi keo. Có một chức năng cho điều này?
Câu trả lời:
Bắt đầu từ Java8 có thể sử dụng String.join()
.
String.join(", ", new String[]{"Hello", "World", "!"})
Tạo:
Hello, World, !
Mặt khác, Apache Commons Lang có một StringUtils
lớp có join
chức năng sẽ nối các mảng lại với nhau để tạo thành một String
.
Ví dụ:
StringUtils.join(new String[] {"Hello", "World", "!"}, ", ")
Tạo các mục sau String
:
Hello, World, !
String.join()
phương thức mới được giới thiệu trong Java 8. Bằng cách này, số lượng lớn người đọc câu trả lời được chấp nhận này sẽ được hưởng lợi từ kiến thức đó. Hiện tại, câu trả lời được bình chọn cao nhất đề cập đến thực tế này là khá lạc lõng bên dưới ...
String.join()
sẽ chỉ hoạt động cho List<CharSequence>
hoặc CharSequence[]
các yếu tố.
Nếu bạn đang tìm kiếm những gì để sử dụng trong Android, đó là:
String android.text.TextUtils.join(CharSequence delimiter, Object[] tokens)
ví dụ:
String joined = TextUtils.join(";", MyStringArray);
Trong Java 8, bạn có thể sử dụng
1) API luồng:
String[] a = new String[] {"a", "b", "c"};
String result = Arrays.stream(a).collect(Collectors.joining(", "));
2) phương thức String.join mới: https://stackoverflow.com/a/21756398/466677
3) lớp java.util.StringJoiner: http://docs.oracle.com/javase/8/docs/api/java/util/StringJoiner.html
Bạn có thể dễ dàng viết một hàm như vậy trong khoảng mười dòng mã:
String combine(String[] s, String glue)
{
int k = s.length;
if ( k == 0 )
{
return null;
}
StringBuilder out = new StringBuilder();
out.append( s[0] );
for ( int x=1; x < k; ++x )
{
out.append(glue).append(s[x]);
}
return out.toString();
}
Một chút mod thay vì sử dụng chuỗi con ():
//join(String array,delimiter)
public static String join(String r[],String d)
{
if (r.length == 0) return "";
StringBuilder sb = new StringBuilder();
int i;
for(i=0;i<r.length-1;i++){
sb.append(r[i]);
sb.append(d);
}
sb.append(r[i]);
return sb.toString();
}
.append()
hai lần cho mỗi String
thay vì nối chúng và sau đó nối vào trình tạo.
Như nhiều câu hỏi gần đây, Java 8 để giải cứu:
Java 8 đã thêm một phương thức tĩnh mới để java.lang.String
thực hiện chính xác những gì bạn muốn:
public static String join(CharSequence delimeter, CharSequence... elements);
Sử dụng nó:
String s = String.join(", ", new String[] {"Hello", "World", "!"});
Kết quả trong:
"Hello, World, !"
Thư viện ổi của Google cũng có loại khả năng này . Bạn cũng có thể xem ví dụ Chuỗi [] từ API.
Như đã được mô tả trong api, hãy cẩn thận với tính bất biến của các phương thức xây dựng.
Nó có thể chấp nhận một loạt các đối tượng để nó hoạt động trong trường hợp của bạn. Theo kinh nghiệm trước đây của tôi, tôi đã thử tham gia một Stack có thể lặp lại và nó hoạt động tốt.
Mẫu từ tôi:
Deque<String> nameStack = new ArrayDeque<>();
nameStack.push("a coder");
nameStack.push("i am");
System.out.println("|" + Joiner.on(' ').skipNulls().join(nameStack) + "|");
in ra: |i am a coder|
Được:
String[] a = new String[] { "Hello", "World", "!" };
Sau đó, như là một thay thế cho câu trả lời của coobird, nơi keo là ",":
Arrays.asList(a).toString().replaceAll("^\\[|\\]$", "")
Hoặc để nối với một chuỗi khác, chẳng hạn như "& amp;".
Arrays.asList(a).toString().replaceAll(", ", " & ").replaceAll("^\\[|\\]$", "")
Tuy nhiên ... CHỈ cái này hoạt động nếu bạn biết rằng các giá trị trong mảng hoặc danh sách KHÔNG chứa chuỗi ký tự ",".
Arrays.asList(a).toString()
làm việc cho những gì tôi muốn làm
Nếu bạn đang sử dụng Spring Framework thì bạn có lớp StringUtils :
import static org.springframework.util.StringUtils.arrayToDelimitedString;
arrayToDelimitedString(new String[] {"A", "B", "C"}, "\n");
Không trong cốt lõi, không. Một tìm kiếm cho "java mảng nối chuỗi keo" sẽ cung cấp cho bạn một số đoạn mã về cách để đạt được điều này mặc dù.
ví dụ
public static String join(Collection s, String delimiter) {
StringBuffer buffer = new StringBuffer();
Iterator iter = s.iterator();
while (iter.hasNext()) {
buffer.append(iter.next());
if (iter.hasNext()) {
buffer.append(delimiter);
}
}
return buffer.toString();
}
Nếu bạn đã đến đây để tìm kiếm chuyển đổi mảng thành chuỗi nhanh, hãy thử Arrays.toString () .
Tạo một đại diện Chuỗi của
Object[]
thông qua. Kết quả được bao quanh bởi ngoặc ("[]"
), mỗi phần tử được chuyển đổi thành Chuỗi thông quaString.valueOf(Object)
và được phân tách bằng", "
. Nếu mảng lànull
, sau đó"null"
được trả lại.
Chỉ dành cho thử thách "Tôi là người ngắn nhất" , đây là mỏ;)
Lặp lại:
public static String join(String s, Object... a) {
StringBuilder o = new StringBuilder();
for (Iterator<Object> i = Arrays.asList(a).iterator(); i.hasNext();)
o.append(i.next()).append(i.hasNext() ? s : "");
return o.toString();
}
Đệ quy:
public static String join(String s, Object... a) {
return a.length == 0 ? "" : a[0] + (a.length == 1 ? "" : s + join(s, Arrays.copyOfRange(a, 1, a.length)));
}
copyOfRange()
").
Không có gì tích hợp mà tôi biết.
Apache Commons Lang có một lớp được gọi là StringUtils
chứa nhiều hàm tham gia.
Đây là cách tôi làm điều đó.
private String join(String[] input, String delimiter)
{
StringBuilder sb = new StringBuilder();
for(String value : input)
{
sb.append(value);
sb.append(delimiter);
}
int length = sb.length();
if(length > 0)
{
// Remove the extra delimiter
sb.setLength(length - delimiter.length());
}
return sb.toString();
}
Một sự thay thế tương tự
/**
* @param delimiter
* @param inStr
* @return String
*/
public static String join(String delimiter, String... inStr)
{
StringBuilder sb = new StringBuilder();
if (inStr.length > 0)
{
sb.append(inStr[0]);
for (int i = 1; i < inStr.length; i++)
{
sb.append(delimiter);
sb.append(inStr[i]);
}
}
return sb.toString();
}
Vòng quay của tôi.
public static String join(Object[] objects, String delimiter) {
if (objects.length == 0) {
return "";
}
int capacityGuess = (objects.length * objects[0].toString().length())
+ ((objects.length - 1) * delimiter.length());
StringBuilder ret = new StringBuilder(capacityGuess);
ret.append(objects[0]);
for (int i = 1; i < objects.length; i++) {
ret.append(delimiter);
ret.append(objects[i]);
}
return ret.toString();
}
public static String join(Object... objects) {
return join(objects, "");
}
Bạn có thích cách 3 dòng của tôi chỉ sử dụng các phương thức của lớp String không?
static String join(String glue, String[] array) {
String line = "";
for (String s : array) line += s + glue;
return (array.length == 0) ? line : line.substring(0, line.length() - glue.length());
}
StringBuilder
nếu bạn cần hiệu quả: P
Trong trường hợp bạn đang sử dụng thư viện Java chức năng và vì một số lý do không thể sử dụng Luồng từ Java 8 (có thể là trường hợp khi sử dụng plugin Android + Retrolambda), đây là một giải pháp chức năng dành cho bạn:
String joinWithSeparator(List<String> items, String separator) {
return items
.bind(id -> list(separator, id))
.drop(1)
.foldLeft(
(result, item) -> result + item,
""
);
}
Lưu ý rằng đó không phải là cách tiếp cận hiệu quả nhất, nhưng nó hoạt động tốt cho các danh sách nhỏ.
Tôi làm theo cách này bằng StringBuilder:
public static String join(String[] source, String delimiter) {
if ((null == source) || (source.length < 1)) {
return "";
}
StringBuilder stringbuilder = new StringBuilder();
for (String s : source) {
stringbuilder.append(s + delimiter);
}
return stringbuilder.toString();
} // join((String[], String)
s + delimiter
(nối chuỗi với toán tử cộng) đánh bại toàn bộ mục đích sử dụng a StringBuilder
.
Có một kỹ thuật tốc ký đơn giản mà tôi sử dụng hầu hết thời gian ..
String op = new String;
for (int i : is)
{
op += candidatesArr[i-1]+",";
}
op = op.substring(0, op.length()-1);
java.util.Arrays có phương thức 'asList'. Cùng với API java.util.List / ArrayList, nó cung cấp cho bạn tất cả những gì bạn cần:;
private static String[] join(String[] array1, String[] array2) {
List<String> list = new ArrayList<String>(Arrays.asList(array1));
list.addAll(Arrays.asList(array2));
return list.toArray(new String[0]);
}