Java:用分隔符连接基元数组
Java: join array of primitives with separator
假设,我有一个数组:
int[] arr = new int[] {1, 2, 3, 4, 5, 6, 7};
我需要使用分隔符连接它的元素,例如," - "
,所以结果我应该得到这样的字符串:
"1 - 2 - 3 - 4 - 5 - 6 - 7"
我该怎么做?
PS: 是的,我知道 this and this 帖子,但它的解决方案不适用于基元数组。
这是我想出的。有几种方法可以做到这一点,它们取决于您使用的工具。
使用 Common Lang 中的 StringUtils
和 ArrayUtils
:
int[] arr = new int[] {1, 2, 3, 4, 5, 6, 7};
String result = StringUtils.join(ArrayUtils.toObject(arr), " - ");
您不能只使用 StringUtils.join(arr, " - ");
,因为 StringUtils
没有该方法的重载版本。虽然,它有方法 StringUtils.join(int[], char)
.
适用于任何 Java 版本,从 1.2 开始。
使用 Java 8 个流:
像这样:
int[] arr = new int[] {1, 2, 3, 4, 5, 6, 7};
String result = Arrays.stream(arr)
.mapToObj(String::valueOf)
.collect(Collectors.joining(" - "));
事实上,有很多变体可以使用流来实现结果。
Java 8 的方法 String.join()
只适用于字符串,所以要使用它你仍然必须将 int[]
转换为 String[]
.
String[] sarr = Arrays.stream(arr).mapToObj(String::valueOf).toArray(String[]::new);
String result = String.join(" - ", sarr);
如果您坚持使用 Java 7 或更早版本且没有库,您可以编写自己的实用方法:
public static String myJoin(int[] arr, String separator) {
if (null == arr || 0 == arr.length) return "";
StringBuilder sb = new StringBuilder(256);
sb.append(arr[0]);
//if (arr.length == 1) return sb.toString();
for (int i = 1; i < arr.length; i++) sb.append(separator).append(arr[i]);
return sb.toString();
}
你能做的:
int[] arr = new int[] {1, 2, 3, 4, 5, 6, 7};
String result = myJoin(arr, " - ");
您可以使用 Guava 来连接元素。您可以在那里找到更多示例和文档。 https://github.com/google/guava/wiki/StringsExplained
Joiner.on("-")
.join(texts);
更准确地说,您应该首先将数组包装成 List
和 Arrays.asList()
or Guava's primitive-friendly 等价物。
Joiner.on("-")
.join(Arrays.asList(1, 2, 3, 4, 5, 6, 7));
Joiner.on("-")
.join(Ints.asList(arr));
在 Java 8+ 中,您可以使用 IntStream
and a StringJoiner
。像,
int[] arr = new int[] { 1, 2, 3, 4, 5, 6, 7 };
StringJoiner sj = new StringJoiner(" - ");
IntStream.of(arr).forEach(x -> sj.add(String.valueOf(x)));
System.out.println(sj.toString());
输出是(按要求)
1 - 2 - 3 - 4 - 5 - 6 - 7
我确定在 Kotlin/Scala 或其他 JVM 语言中也有一种方法可以做到这一点,但您始终可以坚持让事情简单化,就像上面的一小部分值一样:
int i, arrLen = arr.length;
StringBuilder tmp = new StringBuilder();
for (i=0; i<arrLen-1; i++)
tmp.append(arr[i] +" - ");
tmp.append(arr[arrLen-1]);
System.out.println( tmp.toString() );
int[] arr = new int[] { 1, 2, 3, 4, 5, 6, 7 };
IntStream.of(arr).mapToObj(i -> String.valueOf(i)).collect(Collectors.joining(",")) ;
我一直在寻找一种无需首先为每个基元实例化字符串即可在 Stream 中加入基元的方法。我已经到了这个,但它仍然需要装箱。
LongStream.range(0, 500).boxed().collect(Collector.of(StringBuilder::new, (sb, v) -> {
if (sb.length() != 0)
sb.append(',');
sb.append(v.longValue());
}, (a, b) -> a.length() == 0 ? b : b.length() != 0 ? a.append(',').append(b) : a, StringBuilder::toString));
Java 8 解决方案是这样的:
Stream.of(1,2,3,4).map(String::valueOf).collect(Collectors.joining("-"))
对于 Java 7 或更早版本。
public static StringBuilder join(CharSequence delimiter, int... arr) {
if (null == delimiter || null == arr) throw new NullPointerException();
StringBuilder sb = new StringBuilder(String.valueOf(arr[0]));
for (int i = 1; i < arr.length; i++) sb.append(delimiter).append(arr[i]);
return sb;
}
public static void main(String[] args) {
StringBuilder sb = join(" - ", 1, 2, 3, 4);
System.out.println(sb.toString());//you could pass sb also coz println automatically call toString method within it
System.out.println(sb.insert(0, "[").append("]"));
}
Output:
1 - 2 - 3 - 4
[1 - 2 - 3 - 4]
如果您的分隔符是 单个字符 您可以使用 Common Lang 中的 StringUtils:
int[] arr = {1, 2, 3, 4, 5, 6, 7};
String result = StringUtils.join(arr, '-');
但是,如果分隔符是字符串,您应该使用替代方法,因为 StringUtils 的行为很糟糕 (see this ticket)。
假设,我有一个数组:
int[] arr = new int[] {1, 2, 3, 4, 5, 6, 7};
我需要使用分隔符连接它的元素,例如," - "
,所以结果我应该得到这样的字符串:
"1 - 2 - 3 - 4 - 5 - 6 - 7"
我该怎么做?
PS: 是的,我知道 this and this 帖子,但它的解决方案不适用于基元数组。
这是我想出的。有几种方法可以做到这一点,它们取决于您使用的工具。
使用 Common Lang 中的 StringUtils
和 ArrayUtils
:
int[] arr = new int[] {1, 2, 3, 4, 5, 6, 7};
String result = StringUtils.join(ArrayUtils.toObject(arr), " - ");
您不能只使用 StringUtils.join(arr, " - ");
,因为 StringUtils
没有该方法的重载版本。虽然,它有方法 StringUtils.join(int[], char)
.
适用于任何 Java 版本,从 1.2 开始。
使用 Java 8 个流:
像这样:
int[] arr = new int[] {1, 2, 3, 4, 5, 6, 7};
String result = Arrays.stream(arr)
.mapToObj(String::valueOf)
.collect(Collectors.joining(" - "));
事实上,有很多变体可以使用流来实现结果。
Java 8 的方法 String.join()
只适用于字符串,所以要使用它你仍然必须将 int[]
转换为 String[]
.
String[] sarr = Arrays.stream(arr).mapToObj(String::valueOf).toArray(String[]::new);
String result = String.join(" - ", sarr);
如果您坚持使用 Java 7 或更早版本且没有库,您可以编写自己的实用方法:
public static String myJoin(int[] arr, String separator) {
if (null == arr || 0 == arr.length) return "";
StringBuilder sb = new StringBuilder(256);
sb.append(arr[0]);
//if (arr.length == 1) return sb.toString();
for (int i = 1; i < arr.length; i++) sb.append(separator).append(arr[i]);
return sb.toString();
}
你能做的:
int[] arr = new int[] {1, 2, 3, 4, 5, 6, 7};
String result = myJoin(arr, " - ");
您可以使用 Guava 来连接元素。您可以在那里找到更多示例和文档。 https://github.com/google/guava/wiki/StringsExplained
Joiner.on("-")
.join(texts);
更准确地说,您应该首先将数组包装成 List
和 Arrays.asList()
or Guava's primitive-friendly 等价物。
Joiner.on("-")
.join(Arrays.asList(1, 2, 3, 4, 5, 6, 7));
Joiner.on("-")
.join(Ints.asList(arr));
在 Java 8+ 中,您可以使用 IntStream
and a StringJoiner
。像,
int[] arr = new int[] { 1, 2, 3, 4, 5, 6, 7 };
StringJoiner sj = new StringJoiner(" - ");
IntStream.of(arr).forEach(x -> sj.add(String.valueOf(x)));
System.out.println(sj.toString());
输出是(按要求)
1 - 2 - 3 - 4 - 5 - 6 - 7
我确定在 Kotlin/Scala 或其他 JVM 语言中也有一种方法可以做到这一点,但您始终可以坚持让事情简单化,就像上面的一小部分值一样:
int i, arrLen = arr.length;
StringBuilder tmp = new StringBuilder();
for (i=0; i<arrLen-1; i++)
tmp.append(arr[i] +" - ");
tmp.append(arr[arrLen-1]);
System.out.println( tmp.toString() );
int[] arr = new int[] { 1, 2, 3, 4, 5, 6, 7 };
IntStream.of(arr).mapToObj(i -> String.valueOf(i)).collect(Collectors.joining(",")) ;
我一直在寻找一种无需首先为每个基元实例化字符串即可在 Stream 中加入基元的方法。我已经到了这个,但它仍然需要装箱。
LongStream.range(0, 500).boxed().collect(Collector.of(StringBuilder::new, (sb, v) -> {
if (sb.length() != 0)
sb.append(',');
sb.append(v.longValue());
}, (a, b) -> a.length() == 0 ? b : b.length() != 0 ? a.append(',').append(b) : a, StringBuilder::toString));
Java 8 解决方案是这样的:
Stream.of(1,2,3,4).map(String::valueOf).collect(Collectors.joining("-"))
对于 Java 7 或更早版本。
public static StringBuilder join(CharSequence delimiter, int... arr) {
if (null == delimiter || null == arr) throw new NullPointerException();
StringBuilder sb = new StringBuilder(String.valueOf(arr[0]));
for (int i = 1; i < arr.length; i++) sb.append(delimiter).append(arr[i]);
return sb;
}
public static void main(String[] args) {
StringBuilder sb = join(" - ", 1, 2, 3, 4);
System.out.println(sb.toString());//you could pass sb also coz println automatically call toString method within it
System.out.println(sb.insert(0, "[").append("]"));
}
Output:
1 - 2 - 3 - 4
[1 - 2 - 3 - 4]
如果您的分隔符是 单个字符 您可以使用 Common Lang 中的 StringUtils:
int[] arr = {1, 2, 3, 4, 5, 6, 7};
String result = StringUtils.join(arr, '-');
但是,如果分隔符是字符串,您应该使用替代方法,因为 StringUtils 的行为很糟糕 (see this ticket)。