การนำอัลกอริทึม String มาใช้
แนะนำใหม่| English | ความหมาย |
|---|---|
| StringIndexOutOfBoundsException/strɪŋ ˈɪndeks ˈaʊtəv baʊndz ekˈsepʃn/ | StringIndexOutOfBoundsException |
การวนลูปผ่านตัวอักษร
- เพื่อประมวลผล String, วนลูปผ่าน ดัชนี ของมันตั้งแต่
0ถึงlength() - 1 for (int i = 0; i < s.length(); i++) { ... s.substring(i, i+1) ... }s.substring(i, i+1)จะให้ String ที่มีหนึ่งตัวอักษรที่ดัชนีi- วิธีนี้จะเข้าถึงตัวอักษรทั้งหมดตามลำดับ — ซึ่งเป็นพื้นฐานของอัลกอริทึม String ส่วนใหญ่
การนับตัวอักษร
- ผสมลูปเข้ากับ
ifเพื่อนับตัวอักษรที่ตรงตามเงื่อนไข - "นับพยัญชนะ": ลูป, และ
ifถ้าตัวอักษรปัจจุบันเป็นพยัญชนะ,count++ - รูปแบบตัวสะสมจาก 2.9 ใช้ได้โดยตรงกับ String
- เปรียบเทียบตัวอักษรกับ
.equals(), ไม่ใช่==
การสร้าง String ใหม่
- เพื่อแปลงข้อความ, สร้าง String ใหม่ ด้วย
+เนื่องจาก String เป็นแบบไม่เปลี่ยนแปลง (immutable) String result = "";จากนั้นresult = result + something;ภายในลูป- "กลับหัว String": เพิ่มแต่ละตัวอักษรจากท้ายไปหน้า
- ตัวเดิมจะไม่เปลี่ยน — คุณจะสะสม String ใหม่
ขอบเขตของดัชนี
- ดัชนีที่ถูกต้องวิ่งจาก
0ถึงlength() - 1; การเข้าถึงนอกขอบเขตจะทำให้เกิด StringIndexOutOfBoundsException s.substring(i, i+1)ปลอดภัยก็ต่อเมื่อi < s.length()- เงื่อนไขลูป
i < s.length()รักษาiให้อยู่ในขอบเขต - ความผิดพลาดเรื่องขอบเขต Off-by-one เป็นข้อผิดพลาดที่พบบ่อยที่สุดในลูป String
วนลูปผ่านดัชนี String ด้วย i < s.length(), ไม่ใช่ i <= s.length(). ดัชนีที่ถูกต้องสุดท้ายคือ length() - 1; การสัมผัสดัชนี length() จะทำให้เกิด StringIndexOutOfBoundsException และสร้างข้อความที่แปลงแล้วโดย การสะสม String ใหม่ (result += ch) — คุณไม่สามารถแก้ไข String ได้ในสถานที่ เพราะ String เป็นแบบไม่เปลี่ยนแปลง
นับพยัญชนะใน s:
int count = 0;for (int i = 0; i < s.length(); i++) { String ch = s.substring(i, i+1); if ("aeiou".indexOf(ch) >= 0) count++; }- เข้าถึงแต่ละตัวอักษร; นับถ้ามันปรากฏใน
"aeiou"
ประมวลผล String โดย วนลูปตามดัชนี 0 ถึง length()-1 (เงื่อนไข i < s.length()), อ่านแต่ละตัวอักษรด้วย s.substring(i, i+1) นับด้วยตัวแปร if, หรือ สร้าง String ใหม่ โดยการสะสมด้วย + (String เป็นแบบไม่เปลี่ยนแปลง) การอยู่ในขอบเขตจะหลีกเลี่ยง StringIndexOutOfBoundsException
การวนลูปบนตัวอักษรของ HELLO
ลูปจะเข้าถึงดัชนี 0 ถึง length()-1
เงื่อนไขลูปที่ถูกต้องเพื่อเข้าถึงตัวอักษรทั้งหมดของ String s คือ...
Difficulty 1/5 · 100 coins + a small bonus on first completion today
ดัชนีที่มีvalidคือ 0..length()-1 ดังนั้น i < s.length()
การเข้าถึง index s.length() ของ String จะเกิด...
Difficulty 1/5 · 100 coins + a small bonus on first completion today
indexสุดท้ายที่มีvalidคือ length()-1
การสร้าง String กลับด้าน เนื่องจาก String เป็น immutable คุณ...
Difficulty 1/5 · 100 coins + a small bonus on first completion today
String เป็น immutable — สร้างอันใหม่ขึ้นมา
ลูปจะเข้าถึงตัวอักษรกี่ตัวสำหรับ String "HELLO" (โดยใช้ i < length())?
Difficulty 2/5 · 140 coins + a small bonus on first completion today
Indices 0..4 → 5 ตัวอักษร
รูปแบบตัวสะสมจากลูปยังใช้กับการนับตัวอักษรใน String ได้เช่นกัน
Difficulty 1/5 · 100 coins + a small bonus on first completion today
count++ ภายในลูป index จะนับตัวอักษรที่ตรงกัน