ฉันจะได้รับขึ้นอยู่กับวิธีแรกที่n
ตัวละครของสตริงใน Java โดยไม่ต้องทำการตรวจสอบขนาดแรก (อินไลน์เป็นที่ยอมรับ) หรือการเสี่ยงIndexOutOfBoundsException
?
ฉันจะได้รับขึ้นอยู่กับวิธีแรกที่n
ตัวละครของสตริงใน Java โดยไม่ต้องทำการตรวจสอบขนาดแรก (อินไลน์เป็นที่ยอมรับ) หรือการเสี่ยงIndexOutOfBoundsException
?
คำตอบ:
นี่เป็นวิธีที่เรียบร้อย:
String upToNCharacters = s.substring(0, Math.min(s.length(), n));
ความเห็น: ในขณะที่วิธีการแก้ปัญหานี้เป็น "เรียบร้อย" ฉันคิดว่าจริง ๆ แล้วมันสามารถอ่านได้น้อยกว่าโซลูชันที่ใช้if
/ else
อย่างชัดเจน หากผู้อ่านยังไม่เห็นเคล็ดลับนี้เขา / เธอต้องคิดให้เข้าใจรหัสมากขึ้น IMO ความหมายของรหัสนั้นชัดเจนมากขึ้นในif
/ else
รุ่น สำหรับโซลูชันที่อ่านได้ง่ายขึ้นดูคำตอบของ @ paxdiablo
อย่าประดิษฐ์ล้อใหม่ ... :
org.apache.commons.lang.StringUtils.substring(String s, int start, int len)
Javadocพูดว่า:
StringUtils.substring(null, *, *) = null StringUtils.substring("", * , *) = ""; StringUtils.substring("abc", 0, 2) = "ab" StringUtils.substring("abc", 2, 0) = "" StringUtils.substring("abc", 2, 4) = "c" StringUtils.substring("abc", 4, 6) = "" StringUtils.substring("abc", 2, 2) = "" StringUtils.substring("abc", -2, -1) = "b" StringUtils.substring("abc", -4, 2) = "ab"
ดังนั้น:
StringUtils.substring("abc", 0, 4) = "abc"
StringUtils.substring(yourString, 0, n)
yourString.substring(0, n)
อดีตคือจากStringUtils
ในขณะที่หลังใช้String.substring
(ซึ่งให้ยกเว้นถ้าดัชนีสิ้นสุดเกินความยาวสตริง)
if (end > str.length()) { end = str.length();}
StringUtils.substring(String s, int start, int len)
ไม่ใช่ len มันคือ end-Index
Apache Commons LangมีStringUtils.left
วิธีการนี้
String upToNCharacters = StringUtils.left(s, n);
มีคำถามหลายระดับเกี่ยวกับ SO ดังนั้นบางครั้งก็ใช้ความรู้สึกที่ไม่สมบูรณ์แบบบางครั้งคำถามนี้ปิดอย่างน่ากลัว :-)
บางทีคุณอาจอธิบายความเกลียดชังของคุณโดยใช้หนึ่งในสองวิธีที่คุณตัดออก
หากเป็นเพราะคุณไม่ต้องการใส่รหัสของคุณด้วยif
ข้อความสั่งหรือการจับรหัสยกเว้นวิธีแก้ปัญหาหนึ่งก็คือการใช้ฟังก์ชั่นตัวช่วยที่จะดูแลมันให้คุณสิ่งที่ชอบ:
static String substring_safe (String s, int start, int len) { ... }
ซึ่งจะตรวจสอบความยาวล่วงหน้าและดำเนินการตามนั้น (ส่งคืนสตริงที่มีขนาดเล็กกว่าหรือแผ่นที่มีช่องว่าง)
จากนั้นคุณไม่ต้องกังวลกับมันในรหัสของคุณเลยเพียงแค่โทร:
String s2 = substring_safe (s, 10, 7);
แทน:
String s2 = s.substring (10,7);
สิ่งนี้จะได้ผลในกรณีที่คุณกังวล (ตามความเห็นของคุณสำหรับคำตอบอื่น ๆ ) ไม่ทำลายการไหลของรหัสเมื่อทำสิ่งที่สร้างสตริงจำนวนมาก
String upToNCharacters = String.format("%."+ n +"s", str);
น่ากลัวถ้าn
เป็นตัวแปร (ดังนั้นคุณต้องสร้างสตริงรูปแบบ) แต่ค่อนข้างชัดเจนถ้าค่าคงที่:
String upToNCharacters = String.format("%.10s", str);
ใช้วิธีการ substring ดังต่อไปนี้:
int n = 8;
String s = "Hello, World!";
System.out.println(s.substring(0,n);
หาก n มากกว่าความยาวของสตริงสิ่งนี้จะส่งข้อยกเว้นเนื่องจากผู้วิจารณ์คนหนึ่งชี้ไป วิธีแก้ไขปัญหาอย่างง่ายอย่างหนึ่งคือการรวมทั้งหมดนี้ไว้ในเงื่อนไขif(s.length()<n)
ในelse
ข้อของคุณคุณสามารถเลือกได้ว่าคุณต้องการพิมพ์ / ส่งคืนสตริงทั้งหมดหรือจัดการด้วยวิธีอื่น
หากคุณโชคดีพอที่จะพัฒนากับ Kotlin
คุณสามารถใช้take
เพื่อให้บรรลุเป้าหมาย
val someString = "hello"
someString.take(10) // result is "hello"
someString.take(4) // result is "hell" )))
ApacheCommons ทำให้ฉันประหลาดใจ
StringUtils.abbreviate(String str, int maxWidth)
ผนวก "... " ไม่มีตัวเลือกในการเปลี่ยน postfix
WordUtils.abbreviate(String str, int lower, int upper, String appendToEnd)
เงยหน้าขึ้นมองพื้นที่ว่างถัดไป
ฉันแค่จะออกจากที่นี่:
public static String abbreviate(String s, int maxLength, String appendToEnd) {
String result = s;
appendToEnd = appendToEnd == null ? "" : appendToEnd;
if (maxLength >= appendToEnd.length()) {
if (s.length()>maxLength) {
result = s.substring(0, Math.min(s.length(), maxLength - appendToEnd.length())) + appendToEnd;
}
} else {
throw new StringIndexOutOfBoundsException("maxLength can not be smaller than appendToEnd parameter length.");
}
return result;
}
Kotlin: (หากใครต้องการ)
var mText = text.substring(0, text.length.coerceAtMost(20))