ڪيتريون ئي بنيادي ٽيڪنالاجيون آهن جيڪي اسان باقاعده استعمال ڪندا آهيون ان جي باري ۾ سوچڻ کان سواء. خير، ڇا جيڪڏهن توهان ان بابت سوچيو ۽ ڏسو ته ڪيئن ڪجهه بظاهر سادو طريقا لاڳو ٿين ٿا؟ مان سمجهان ٿو ته اهو اسان کي جاوا جي هڪ قدم ويجهو وڃڻ ۾ مدد ڏيندو) اچو ته هڪ اهڙي صورتحال جو تصور ڪريون جنهن ۾ اسان کي ڪجهه تارن ۾ هڪ خاص ڪردار ڪڍڻو پوندو. اسان اهو ڪيئن ڪري سگهون ٿا جاوا ۾؟ مثال طور، ڪال ڪندي
Java String charAt
. اسان اڄ جي مضمون ۾ طريقيڪار جي باري ۾ charAt()
ڳالهائي ويندي .
نحو
char charAt(int index)
مخصوص انڊيڪس تي چار قدر واپس ڪري ٿو. انڊيڪس جي حد 0 کان length()-1
. char
اهو آهي، ترتيب جي پهرين قيمت ۾ آهي index 0
، ايندڙ آهي ان ۾، index 1
وغيره، جيئن ته صف جي ترتيب سان معاملو آهي.
مثال
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));
}
پھريون لڪير پھريون اکر کڻندو آھي، ٻيو لڪير ٻيو وٺندو آھي، وغيره. جتان نه println
، پر هتي استعمال ڪيو ويو آهي print
، بغير ڪنهن نئين لائين جي، اسان کي هيٺ ڏنل آئوٽ ڪنسول ڏانهن حاصل ڪنداسين:
Java
جيڪڏهن char
ڏنل انڊيڪس يونيڪوڊ طور پيش ڪيو ويو آهي، طريقي جو نتيجو java charAt()
اهو ڪردار هوندو جيڪو هن يونيڪوڊ جي نمائندگي ڪري ٿو:
System.out.println("J\u0061vaRush".charAt(1));
ڪنسول آئوٽ:
a
ڇا آهي "هود هيٺ"
اهو ڪيئن ڪم ڪري ٿو، توهان پڇو؟ حقيقت اها آهي ته هر شئي ۾ ڏنل سٽرنگ جي عناصر جي بائيٽ سان گڏString
هڪ صف شامل آهي :byte
private final byte[] value;
۽ هتي ئي طريقو آهي chatAt
:
public char charAt(int index) {
if (isLatin1()) {
return StringLatin1.charAt(value, index);
} else {
return StringUTF16.charAt(value, index);
}
}
isLatin1
- هڪ جھنڊو اهو ظاهر ڪري ٿو ته ڇا اسان جي اسٽرنگ ۾ صرف لاطيني اکرن تي مشتمل آهي يا نه. اهو طئي ڪري ٿو ته ڪهڙو طريقو اڳتي هلي سڏيو ويندو.
isLatin1 = سچ
جيڪڏهن اسٽرنگ صرف لاطيني اکرن تي مشتمل آهي، هڪ جامدcharAt
طبقي جو طريقو سڏيو ويندو آهي StringLatin1
:
public static char charAt(byte[] value, int index) {
if (index < 0 || index >= value.length) {
throw new StringIndexOutOfBoundsException(index);
}
return (char)(value[index] & 0xff);
}
پهريون قدم چيڪ ڪرڻ آهي ته ايندڙ انڊيڪس 0 کان وڌيڪ يا برابر آهي، ۽ اهو اندروني بائيٽ صف کان ٻاهر نه ٿو وڃي، ۽ جيڪڏهن اهو معاملو نه آهي، ته پوء هڪ استثنا اڇلايو ويندو new StringIndexOutOfBoundsException(index)
. جيڪڏهن چيڪ گذري ويا آهن، ته اسان کي گهربل عنصر ورتو وڃي. آخر ۾ اسان ڏسون ٿا:
&
بائنري آپريشن لاءِbyte
bitwise تائين وڌايو0xff
ڪجھ به نه ڪندو آهي پر&
هڪ دليل جي ضرورت آهي(char)
ASCII ٽيبل مان ڊيٽا کي تبديل ڪري ٿوchar
isLatin1 = غلط
جيڪڏھن اسان وٽ صرف لاطيني اکر نه ھجن، ڪلاس استعمال ڪيو ويندوStringUTF16
۽ ان جو جامد طريقو سڏيو ويندو:
public static char charAt(byte[] value, int index) {
checkIndex(index, value);
return getChar(value, index);
}
جنهن کي موڙ ۾ سڏي ٿو:
public static void checkIndex(int off, byte[] val) {
String.checkIndex(off, length(val));
}
۽ هو هڪ جامد طريقي جي نمائندگي ڪري ٿو String
:
static void checkIndex(int index, int length) {
if (index < 0 || index >= length) {
throw new StringIndexOutOfBoundsException("index " + index +
", length " + length);
}
}
هتي، حقيقت ۾، هڪ چيڪ ڪيو ويو آهي ته ڏسو انڊيڪس صحيح آهي: ٻيهر، ڇا اهو مثبت آهي يا صفر، ۽ ڇا اهو صف جي حدن کان ٻاهر نه ويو آهي. پر ھڪڙي طبقي ۾ StringUTF16
ھڪڙي طريقي سان، charAt
ٻيو طريقو سڏڻ وڌيڪ دلچسپ ٿيندو:
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));
}
اچو ته تجزيو ڪرڻ شروع ڪريون ته اصل ۾ هتي ڇا ٿي رهيو آهي. طريقي جي شروعات ۾ پهريون قدم انڊيڪس جي صحيحيت لاء هڪ ٻيو چيڪ آهي. سمجھڻ لاءِ اڳتي ڇا ٿئي ٿو، توھان کي سمجھڻ جي ضرورت آھي: جڏھن ھڪڙو غير لاطيني ڪردار صف ۾ داخل ٿئي ٿو value
، اھو ٻن بائيٽ (ٻه سري سيلز) جي نمائندگي ڪري ٿو. جيڪڏهن اسان وٽ ٻه سيريلڪ اکرن جو هڪ تار آهي - "av"، پوء:
- 'a' لاءِ هي بائيٽ جو هڪ جوڙو آهي - 48 ۽ 4؛
- لاءِ 'ان' - 50 ۽ 4.
value
- {48, 4, 50, 4} دراصل، هي طريقو ٻن صفن جي سيلن سان ڪم ڪندو آهي value
. تنهن ڪري، ايندڙ قدم index <<= 1;
صف ۾ گهربل ڪردار جي پهرين بائيٽ جي انڊيڪس تي سڌو سنئون حاصل ڪرڻ لاء هڪ شفٽ آهي value
. هاڻي اچو ته اسان وٽ هڪ تار آهي "абвг"
. پوءِ قدر جي صف هن طرح نظر ايندي: {48, 4, 49, 4, 50, 4, 51, 4}. اسان اسٽرنگ جي ٽئين عنصر لاءِ پڇون ٿا، ۽ پوءِ بائنري نمائندگي 00000000 00000011 آهي. جڏهن 1 ذريعي شفٽ ڪيو وڃي ٿو، اسان کي 00000000 00000110 ملي ٿو، اهو آهي index = 6
. bitwise عملن تي پنھنجي ڄاڻ کي تازو ڪرڻ لاء، توھان ھي مضمون پڙھي سگھو ٿا . اسان ڪجھ متغير پڻ ڏسون ٿا: HI_BYTE_SHIFT
ھن صورت ۾ اھو آھي 0. LO_BYTE_SHIFT
ھن صورت ۾ اھو آھي 8. ھن طريقي جي آخري لائن ۾:
- هڪ عنصر قدر جي صف مان ورتو ويو آهي ۽ bitwise طرفان منتقل ڪيو ويو آهي
HI_BYTE_SHIFT
، يعني 0، جڏهن ته وڌنديindex +1
.مثال طور اسٽرنگ سان
"абвг"
، ڇهين بائيٽ - 51 - ائين ئي رهندو، پر ساڳئي وقت انڊيڪس 7 تائين وڌي ٿو. - ان کان پوء، صف جو ايندڙ عنصر ورتو وڃي ٿو ۽ ساڳئي طريقي سان bitwise شفٽ ڪيو وڃي، پر LO_BYTE_SHIFT طرفان، يعني 8 بٽس طرفان.
۽ جيڪڏهن اسان وٽ بائيٽ 4 هجي، جنهن ۾ بائنري نمائندگي آهي - 00000000 00000100، پوءِ 8 بِٽ ذريعي شفٽ ڪرڻ کان پوءِ اسان وٽ 00000100 00000000 هوندو. جيڪڏهن اهو هڪ عدد آهي - 1024.
- اڳيون، انهن ٻن قدرن لاءِ، عمل هيٺ اچي ٿو
| (OR)
.۽ جيڪڏهن اسان وٽ بائيٽ 51 ۽ 1024 هجن، جيڪي بائنري نمائندگي ۾ 00000000 00000000 00110011 ۽ 00000100 00000000 وانگر نظر اچن ٿا، پوء آپريشن کان پوء
OR
اسان حاصل ڪنداسين 00000100 00110011، جنهن جو مطلب آهي سسٽم نمبر 107 ۾.خير، آخر ۾، نمبر 1075 کي چار قسم ۾ تبديل ڪيو ويندو آهي، ۽ int -> char کي تبديل ڪرڻ وقت، ASCII ٽيبل استعمال ڪيو ويندو آهي، ۽ ان ۾، نمبر 1075 جي هيٺان، ڪردار 'r' هوندو آهي.
charAt()
دراصل، جاوا پروگرامنگ ۾ طريقي جي نتيجي ۾ اسان کي 'g' حاصل ٿئي ٿو .
GO TO FULL VERSION