ฉันต้องการเข้าร่วมString[]
กับสายกาว มีฟังก์ชั่นนี้หรือไม่?
ฉันต้องการเข้าร่วมString[]
กับสายกาว มีฟังก์ชั่นนี้หรือไม่?
คำตอบ:
เริ่มต้นจากJava8String.join()
มันเป็นไปได้ที่จะใช้งาน
String.join(", ", new String[]{"Hello", "World", "!"})
สร้าง:
Hello, World, !
มิฉะนั้นApache คอมมอนส์แลงมีStringUtils
ระดับซึ่งมีฟังก์ชั่นที่จะเข้าร่วมอาร์เรย์ร่วมกันเพื่อให้join
String
ตัวอย่างเช่น:
StringUtils.join(new String[] {"Hello", "World", "!"}, ", ")
สร้างสิ่งต่อไปนี้String
:
Hello, World, !
String.join()
วิธีการใหม่ที่แนะนำใน Java 8 ด้วยวิธีนี้ผู้คนจำนวนมากที่อ่านคำตอบที่ยอมรับนี้จะได้รับประโยชน์จากความรู้นั้น ขณะนี้ได้รับการโหวตมากที่สุดคำตอบที่กล่าวขวัญความเป็นจริงนี้จะหายไปค่อนข้างลงมาด้านล่าง ...
String.join()
จะใช้งานได้เฉพาะกับองค์ประกอบList<CharSequence>
หรือ CharSequence[]
หากคุณกำลังมองหาสิ่งที่จะใช้ใน Android มันเป็น:
String android.text.TextUtils.join(CharSequence delimiter, Object[] tokens)
ตัวอย่างเช่น:
String joined = TextUtils.join(";", MyStringArray);
ใน Java 8 คุณสามารถใช้
1) Stream API:
String[] a = new String[] {"a", "b", "c"};
String result = Arrays.stream(a).collect(Collectors.joining(", "));
2) วิธีการ String.join ใหม่: https://stackoverflow.com/a/21756398/466677
3) คลาส java.util.StringJoiner: http://docs.oracle.com/javase/8/docs/api/java/util/StringJoiner.html
คุณสามารถเขียนฟังก์ชั่นดังกล่าวได้อย่างง่ายดายในโค้ดประมาณสิบบรรทัด:
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();
}
mod เล็กน้อยแทนที่จะใช้ substring ():
//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()
สองครั้งString
แทนกันต่อกันแล้วต่อท้ายกับตัวสร้าง
เมื่อเร็ว ๆ นี้มีคำถามมากมาย Java 8 ที่ช่วยเหลือ:
Java 8 เพิ่มวิธีการแบบคงที่ใหม่java.lang.String
ซึ่งทำสิ่งที่คุณต้องการ:
public static String join(CharSequence delimeter, CharSequence... elements);
ใช้มัน:
String s = String.join(", ", new String[] {"Hello", "World", "!"});
ผลลัพธ์ใน:
"Hello, World, !"
ห้องสมุดของ Google guava ยังมีความสามารถเช่นนี้ คุณสามารถดูตัวอย่าง String [] ได้จาก API
ดังที่อธิบายไว้แล้วใน API โปรดระวังการเปลี่ยนแปลงของวิธีการสร้าง
มันสามารถรับชุดของวัตถุต่าง ๆ ได้ดังนั้นมันจะทำงานในกรณีของคุณ จากประสบการณ์ครั้งก่อนของฉันฉันพยายามเข้าร่วมกองซ้อนซึ่งเป็น iterable และทำงานได้ดี
ตัวอย่างจากฉัน:
Deque<String> nameStack = new ArrayDeque<>();
nameStack.push("a coder");
nameStack.push("i am");
System.out.println("|" + Joiner.on(' ').skipNulls().join(nameStack) + "|");
พิมพ์ออกมา: |i am a coder|
ได้รับ:
String[] a = new String[] { "Hello", "World", "!" };
จากนั้นเป็นทางเลือกของคำตอบของ coobird ที่กาวคือ ",":
Arrays.asList(a).toString().replaceAll("^\\[|\\]$", "")
หรือเชื่อมต่อกับสตริงอื่นเช่น "& amp;"
Arrays.asList(a).toString().replaceAll(", ", " & ").replaceAll("^\\[|\\]$", "")
อย่างไรก็ตาม ... อันนี้ใช้ได้เฉพาะถ้าคุณรู้ว่าค่าในอาร์เรย์หรือรายการไม่มีสตริงอักขระ ","
Arrays.asList(a).toString()
ทำงานในสิ่งที่ฉันต้องการจะทำ
หากคุณใช้Spring FrameworkคุณจะมีคลาสStringUtils :
import static org.springframework.util.StringUtils.arrayToDelimitedString;
arrayToDelimitedString(new String[] {"A", "B", "C"}, "\n");
ไม่ใช่ในแกนไม่ใช่ การค้นหา "จาวาอาร์เรย์เข้าร่วมสตริงกาว" จะให้ตัวอย่างโค้ดบางอย่างเกี่ยวกับวิธีการที่จะบรรลุนี้
เช่น
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();
}
หากคุณได้ที่ดินที่นี่มองหาแปลงอาร์เรย์กับสตริงอย่างรวดเร็วลองArrays.toString ()
สร้างการเป็นตัวแทนสตริงของการ
Object[]
ส่งผ่าน ผลที่ถูกล้อมรอบด้วยวงเล็บ ("[]"
) แต่ละองค์ประกอบจะถูกแปลงเป็นสตริงผ่านและแยกจากกันโดยString.valueOf(Object)
", "
ถ้าอาร์เรย์เป็นnull
เช่นนั้น"null"
จะถูกส่งกลับ
สำหรับความท้าทาย"ฉันสั้นที่สุด"นี่คือเหมือง;)
ซ้ำ:
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();
}
recursive:
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()
")
ไม่มีอะไรในตัวที่ฉันรู้
Apache Commons Langมีคลาสที่เรียกว่าStringUtils
ซึ่งมีฟังก์ชั่นการเข้าร่วมจำนวนมาก
นี่คือวิธีที่ฉันทำ
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();
}
ทางเลือกที่คล้ายกัน
/**
* @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();
}
สปินของฉัน
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, "");
}
คุณชอบวิธี 3 บรรทัดของฉันโดยใช้วิธีการของคลาส String หรือไม่?
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
ถ้าคุณต้องการประสิทธิภาพ: P
วิธีรับ "str1, str2" จาก "str1", "str2", "":
Stream.of("str1", "str2", "").filter(str -> !str.isEmpty()).collect(Collectors.joining(", "));
นอกจากนี้คุณสามารถเพิ่มการตรวจสอบโมฆะพิเศษ
ในกรณีที่คุณใช้ไลบรารี่ Functional Java และด้วยเหตุผลบางอย่างไม่สามารถใช้ Streams จาก Java 8 (ซึ่งอาจเป็นกรณีที่ใช้ปลั๊กอิน Android + Retrolambda) นี่เป็นวิธีแก้ปัญหาสำหรับคุณ:
String joinWithSeparator(List<String> items, String separator) {
return items
.bind(id -> list(separator, id))
.drop(1)
.foldLeft(
(result, item) -> result + item,
""
);
}
โปรดทราบว่ามันไม่ใช่วิธีการที่มีประสิทธิภาพที่สุด แต่ใช้งานได้ดีสำหรับรายการเล็ก ๆ
ฉันทำอย่างนี้โดยใช้ 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
(concatenation สตริงกับผู้ประกอบการบวก) StringBuilder
เอาชนะทั้งวัตถุประสงค์ของการใช้
มีเทคนิคชวเลขง่ายๆที่ฉันใช้บ่อยครั้ง ..
String op = new String;
for (int i : is)
{
op += candidatesArr[i-1]+",";
}
op = op.substring(0, op.length()-1);
java.util.Arrays มีเมธอด 'asList' เมื่อใช้ร่วมกับ java.util.List / ArrayList API สิ่งนี้จะให้ทุกสิ่งที่คุณต้องการ :;
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]);
}