ฉันรู้ว่านี่เป็นคำถามสำหรับมือใหม่ แต่จะเทียบเท่ากับการดำเนินการสตริงของ C # ใน Java หรือไม่
โดยเฉพาะผมกำลังพูดถึงและString.Format
String.Join
ฉันรู้ว่านี่เป็นคำถามสำหรับมือใหม่ แต่จะเทียบเท่ากับการดำเนินการสตริงของ C # ใน Java หรือไม่
โดยเฉพาะผมกำลังพูดถึงและString.Format
String.Join
คำตอบ:
อ็อบเจ็กต์ Java String มีformat
เมธอด (ณ 1.5) แต่ไม่มีjoin
เมธอด
ที่จะได้รับพวงของวิธีการสาธารณูปโภค String ประโยชน์ไม่รวมอยู่แล้วคุณสามารถใช้org.apache.commons.lang.StringUtils
String.join()
วิธีการ
สตริงรูปแบบ สำหรับการเข้าร่วมคุณต้องเขียนของคุณเอง:
static String join(Collection<?> s, String delimiter) {
StringBuilder builder = new StringBuilder();
Iterator<?> iter = s.iterator();
while (iter.hasNext()) {
builder.append(iter.next());
if (!iter.hasNext()) {
break;
}
builder.append(delimiter);
}
return builder.toString();
}
ข้างต้นมาจากhttp://snippets.dzone.com/posts/show/91
สำหรับ Java 8 join()
ตอนนี้มีให้ใช้งานเป็นสองคลาสเมธอดในคลาส String ในทั้งสองกรณีอาร์กิวเมนต์แรกคือตัวคั่น
คุณสามารถส่งผ่านแต่ละรายการCharSequence
เป็นอาร์กิวเมนต์เพิ่มเติม :
String joined = String.join(", ", "Antimony", "Arsenic", "Aluminum", "Selenium");
// "Antimony, Arsenic, Alumninum, Selenium"
หรือคุณสามารถส่งIterable<? extends CharSequence>
:
List<String> strings = new LinkedList<String>();
strings.add("EX");
strings.add("TER");
strings.add("MIN");
strings.add("ATE");
String joined = String.join("-", strings);
// "EX-TER-MIN-ATE"
Java 8 ยังเพิ่มคลาสใหม่StringJoiner
ซึ่งคุณสามารถใช้ได้ดังนี้:
StringJoiner joiner = new StringJoiner("&");
joiner.add("x=9");
joiner.add("y=5667.7");
joiner.add("z=-33.0");
String joined = joiner.toString();
// "x=9&y=5667.7&z=-33.0"
TextUtils.joinพร้อมใช้งานบน Android
คุณยังสามารถใช้อาร์กิวเมนต์ตัวแปรสำหรับสตริงได้ดังนี้:
String join (String delim, String ... data) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < data.length; i++) {
sb.append(data[i]);
if (i >= data.length-1) {break;}
sb.append(delim);
}
return sb.toString();
}
สำหรับการเข้าร่วมฉันเชื่อว่าสิ่งนี้อาจดูซับซ้อนน้อยลงเล็กน้อย:
public String join (Collection<String> c) {
StringBuilder sb=new StringBuilder();
for(String s: c)
sb.append(s);
return sb.toString();
}
ฉันไม่ได้ใช้ไวยากรณ์ Java 5 มากเท่าที่ฉันต้องการ (เชื่อหรือไม่ว่าฉันใช้ 1.0.x เมื่อเร็ว ๆ นี้) ดังนั้นฉันอาจจะค่อนข้างเป็นสนิม แต่ฉันแน่ใจว่าแนวคิดนั้นถูกต้อง .
การแก้ไขเพิ่มเติม: การต่อท้ายสตริงอาจช้า แต่ถ้าคุณกำลังทำงานกับโค้ด GUI หรือรูทีนที่ทำงานสั้น ๆ ไม่สำคัญว่าคุณจะใช้เวลา. 005 วินาทีหรือ. 006 ดังนั้นหากคุณมีคอลเล็กชันชื่อ "joinMe" ที่คุณต้องการต่อท้ายสตริง "เป้าหมาย" ที่มีอยู่มันจะไม่น่ากลัวที่จะแทรกในบรรทัดนี้:
for(String s : joinMe)
target += s;
มันค่อนข้างไม่มีประสิทธิภาพ (และเป็นนิสัยที่ไม่ดี) แต่ไม่มีอะไรที่คุณจะสามารถรับรู้ได้เว้นแต่จะมีสตริงหลายพันสายหรืออยู่ในวงใหญ่หรือโค้ดของคุณมีความสำคัญต่อประสิทธิภาพอย่างมาก
ที่สำคัญจำง่ายสั้นเร็วและน่าอ่านมาก ประสิทธิภาพไม่ใช่สิ่งที่ชนะโดยอัตโนมัติในตัวเลือกการออกแบบเสมอไป
นี่คือคำตอบที่ค่อนข้างง่าย ใช้+=
เนื่องจากเป็นรหัสน้อยและให้เครื่องมือเพิ่มประสิทธิภาพแปลงเป็นรหัสStringBuilder
ให้คุณ เมื่อใช้วิธีนี้คุณไม่ต้องทำการตรวจสอบ "สุดท้าย" ใด ๆ ในลูปของคุณ (การปรับปรุงประสิทธิภาพ) และคุณไม่ต้องกังวลว่าจะตัดตัวคั่นใด ๆ ออกในตอนท้าย
Iterator<String> iter = args.iterator();
output += iter.hasNext() ? iter.next() : "";
while (iter.hasNext()) {
output += "," + iter.next();
}
ฉันไม่ต้องการนำเข้าไลบรารี Apache ทั้งหมดเพื่อเพิ่มฟังก์ชันการเข้าร่วมแบบธรรมดานี่คือแฮ็คของฉัน
public String join(String delim, List<String> destinations) {
StringBuilder sb = new StringBuilder();
int delimLength = delim.length();
for (String s: destinations) {
sb.append(s);
sb.append(delim);
}
// we have appended the delimiter to the end
// in the previous for-loop. Let's now remove it.
if (sb.length() >= delimLength) {
return sb.substring(0, sb.length() - delimLength);
} else {
return sb.toString();
}
}
removeCharAt
ไม่อยู่และฟังก์ชั่นทั้งไม่มีผลตอบแทนที่ไม่เป็น String ... จะแก้ไขปัญหานี้
หากคุณต้องการรวม (ต่อ) หลาย ๆ สตริงเข้าด้วยกันคุณควรใช้ StringBuilder มันดีกว่าการใช้
for(String s : joinMe)
target += s;
นอกจากนี้ยังมีประสิทธิภาพเล็กน้อยที่ชนะ StringBuffer เนื่องจาก StringBuilder ไม่ใช้การซิงโครไนซ์
สำหรับวิธีอรรถประโยชน์วัตถุประสงค์ทั่วไปเช่นนี้ (ในที่สุด) จะถูกเรียกหลายครั้งในหลาย ๆ สถานการณ์ดังนั้นคุณควรทำให้มีประสิทธิภาพและไม่จัดสรรวัตถุชั่วคราวจำนวนมาก เราได้จัดทำโปรไฟล์แอป Java ที่แตกต่างกันจำนวนมากและเกือบตลอดเวลาพบว่าการต่อสตริงและการจัดสรรสตริง / อักขระ [] ใช้เวลา / หน่วยความจำจำนวนมาก
คอลเลกชันที่ใช้ซ้ำได้ของเรา -> วิธีการสตริงจะคำนวณขนาดของผลลัพธ์ที่ต้องการก่อนจากนั้นจึงสร้าง StringBuilder ด้วยขนาดเริ่มต้นนั้น วิธีนี้จะหลีกเลี่ยงการเพิ่ม / คัดลอก char [] ภายในโดยไม่จำเป็นที่ใช้ในการต่อท้ายสตริง
ฉันเขียนเอง:
public static String join(Collection<String> col, String delim) {
StringBuilder sb = new StringBuilder();
Iterator<String> iter = col.iterator();
if (iter.hasNext())
sb.append(iter.next().toString());
while (iter.hasNext()) {
sb.append(delim);
sb.append(iter.next().toString());
}
return sb.toString();
}
แต่Collection
ไม่ได้รับการสนับสนุนโดย JSP ดังนั้นสำหรับฟังก์ชันแท็กฉันเขียน:
public static String join(List<?> list, String delim) {
int len = list.size();
if (len == 0)
return "";
StringBuilder sb = new StringBuilder(list.get(0).toString());
for (int i = 1; i < len; i++) {
sb.append(delim);
sb.append(list.get(i).toString());
}
return sb.toString();
}
และใส่ลงใน.tld
ไฟล์:
<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.1" xmlns="http://java.sun.com/xml/ns/javaee"
<function>
<name>join</name>
<function-class>com.core.util.ReportUtil</function-class>
<function-signature>java.lang.String join(java.util.List, java.lang.String)</function-signature>
</function>
</taglib>
และใช้ในไฟล์ JSP เป็น:
<%@taglib prefix="funnyFmt" uri="tag:com.core.util,2013:funnyFmt"%>
${funnyFmt:join(books, ", ")}
StringUtilsเป็นคลาสที่มีประโยชน์มากในไลบรารี Apache Commons Lang
นอกจากนี้MessageFormat.format()
ที่ทำงานเช่น C # String.Format()
's
ฉันเห็นการใช้งาน String ที่ซับซ้อนเกินไปเข้าร่วมที่นี่ หากคุณไม่มี Java 1.8 และคุณไม่ต้องการนำเข้าไลบรารีใหม่การใช้งานด้านล่างนี้ก็เพียงพอแล้ว
public String join(Collection<String> col, String delim) {
StringBuilder sb = new StringBuilder();
for ( String s : col ) {
if ( sb.length() != 0 ) sb.append(delim);
sb.append(s);
}
return sb.toString();
}
ArrayList<Double> j=new ArrayList<>;
j.add(1);
j.add(.92);
j.add(3);
String ntop=j.toString(); //ntop= "[1, 0.92, 3]"
โดยพื้นฐานแล้ว String ntop จะเก็บค่าของคอลเลคชันทั้งหมดด้วยตัวคั่นและวงเล็บจุลภาค