Ana akeh teknik dhasar sing digunakake kanthi rutin tanpa dipikirake. Inggih, apa yen sampeyan mikir babagan iki lan ndeleng carane sawetara cara sing gampang ditindakake? Aku iki bakal mbantu kita njaluk siji langkah nyedhaki Jawa) Ayo mbayangno kahanan kang kita kudu extract karakter tartamtu ing sawetara senar. Kepiye carane bisa nindakake iki ing basa Jawa? Contone, kanthi nelpon ing
Java String charAt
. charAt()
Kita bakal ngomong babagan cara ing artikel dina iki.
Sintaksis
char charAt(int index)
ngasilake nilai char ing indeks kasebut. Indeks kisaran saka 0 kanggo length()-1
. Sing, char
nilai pisanan saka urutan ing index 0
, sabanjuré ing , index 1
etc., minangka kasus karo indeksasi array.
Tuladha
public static void main(String[] args) {
System.out.print("JavaRush".charAt(0));
System.out.print("JavaRush".charAt(1));
System.out.print("JavaRush".charAt(2));
System.out.print("JavaRush".charAt(3));
}
Baris pisanan njupuk karakter pisanan, baris kapindho njupuk karakter liyane, lan sateruse. Amarga ora println
, nanging digunakake ing kene print
, tanpa baris anyar, kita bakal entuk output ing ngisor iki menyang konsol:
Java
Yen char
indeks kasebut dituduhake minangka Unicode, asil metode kasebut java charAt()
bakal dadi karakter sing makili Unicode iki:
System.out.println("J\u0061vaRush".charAt(1));
Output konsol:
a
Apa sing diarani "ing ngisor tudung"
Kepiye cara kerjane, sampeyan takon? Kasunyatane yaiku saben obyekString
ngemot array byte
kanthi bita saka unsur-unsur string sing diwenehake:
private final byte[] value;
Lan iki cara dhewe chatAt
:
public char charAt(int index) {
if (isLatin1()) {
return StringLatin1.charAt(value, index);
} else {
return StringUTF16.charAt(value, index);
}
}
isLatin1
- gendera sing nuduhake yen string kita mung ngemot karakter Latin utawa ora. Iki nemtokake cara sing bakal diarani sabanjure.
isLatin1 = bener
Yen string mung ngemot karakter Latin, metodecharAt
kelas statis diarani StringLatin1
:
public static char charAt(byte[] value, int index) {
if (index < 0 || index >= value.length) {
throw new StringIndexOutOfBoundsException(index);
}
return (char)(value[index] & 0xff);
}
Langkah kapisan kanggo mriksa sing indeks mlebu luwih saka utawa padha karo 0, lan iku ora ngluwihi array byte internal, lan yen iki ora cilik, pangecualian di buwang new StringIndexOutOfBoundsException(index)
. Yen mriksa wis liwati, banjur unsur kita kudu dijupuk. Ing pungkasan kita ndeleng:
&
ngluwihi kanggo operasi binar kanggobyte
bitwise0xff
ora nindakake apa-apa nanging&
mbutuhake argumentasi(char)
Ngonversi data saka tabel ASCII kanggochar
isLatin1 = palsu
Yen kita duwe luwih saka mung karakter Latin, kelas kasebut bakal digunakakeStringUTF16
lan metode statis kasebut bakal diarani:
public static char charAt(byte[] value, int index) {
checkIndex(index, value);
return getChar(value, index);
}
Kang banjur nelpon:
public static void checkIndex(int off, byte[] val) {
String.checkIndex(off, length(val));
}
Lan dheweke utusan menyang metode statis String
:
static void checkIndex(int index, int length) {
if (index < 0 || index >= length) {
throw new StringIndexOutOfBoundsException("index " + index +
", length " + length);
}
}
Kene, ing kasunyatan, mriksa digawe kanggo ndeleng yen indeks bener: maneh, apa iku positif utawa nul, lan apa ora ngluwihi watesan saka Uploaded. Nanging ing kelas StringUTF16
kanthi metode, charAt
nelpon cara liya bakal luwih menarik:
static char getChar(byte[] val, int index) {
assert index >= 0 && index < length(val) : "Trusted caller missed bounds check";
index <<= 1;
return (char)(((val[index++] & 0xff) << HI_BYTE_SHIFT) |
((val[index] & 0xff) << LO_BYTE_SHIFT));
}
Ayo miwiti nganalisa apa sing kedadeyan ing kene. Langkah pisanan ing wiwitan metode yaiku mriksa liyane kanggo validitas indeks. Kanggo mangerteni apa sing kedadeyan sabanjure, sampeyan kudu ngerti: nalika karakter non-Latin mlebu ing array value
, diwakili dening rong bita (loro sel array). Yen kita duwe senar saka rong karakter Cyrillic - "av", banjur:
- kanggo 'a' iki pasangan bita - 48 lan 4;
- kanggo 'ing' - 50 lan 4.
value
- {48, 4, 50, 4} Bener, cara iki bisa digunakake karo rong sel array value
. Mulane, langkah sabanjure yaiku shift index <<= 1;
kanggo langsung menyang indeks byte pisanan karakter sing dikarepake ing array value
. Saiki ayo ngomong yen kita duwe senar "абвг"
. Banjur array nilai bakal katon kaya iki: {48, 4, 49, 4, 50, 4, 51, 4}. Kita njaluk unsur katelu saka senar, banjur perwakilan binar 00000000 00000011. Nalika dipindhah dening 1, kita entuk 00000000 00000110, yaiku index = 6
. Kanggo refresh kawruh babagan operasi bitwise, sampeyan bisa maca artikel iki . Kita uga ndeleng sawetara variabel: HI_BYTE_SHIFT
ing kasus iki 0. LO_BYTE_SHIFT
ing kasus iki 8. Ing baris pungkasan metode iki:
- Unsur dijupuk saka array nilai lan bitwise dipindhah dening
HI_BYTE_SHIFT
, yaiku, 0, nalika nambahindex +1
.Ing conto karo senar
"абвг"
, byte enem - 51 - bakal tetep, nanging ing wektu sing padha indeks mundhak kanggo 7. - Sawisé iku, unsur sabanjuré saka Uploaded dijupuk lan mindhah bitwise ing cara sing padha, nanging dening LO_BYTE_SHIFT, sing, dening 8 bit.
Lan yen kita duwe byte 4, sing nduweni perwakilan binar - 00000000 00000100, banjur sawise nggeser 8 bit kita bakal duwe 00000100 00000000. Yen integer - 1024.
- Sabanjure, kanggo rong nilai kasebut, tindakake operasi kasebut
| (OR)
.Lan yen kita duwe bait 51 lan 1024, sing ing perwakilan binar katon kaya 00000000 00110011 lan 00000100 00000000, banjur sawise operasi
OR
kita bakal entuk 00000100 00110011, sing tegese nomer 1075 ing sistem desimal.Inggih, ing pungkasan, angka 1075 diowahi dadi jinis char, lan nalika ngowahi int -> char, tabel ASCII digunakake, lan ing kono, ing nomer 1075, ana karakter 'r'.
charAt()
ing pemrograman Java.
GO TO FULL VERSION