Салам! Бул макалада биз элементтердин тизмесин Javaдагы элементтердин массивине кантип айландыруу керектигин карап чыгабыз. Чынында, муну жасоонун көптөгөн жолдору жок жана алардын бардыгы жөнөкөй, ошондуктан макала татаал болбойт. Эмне менен иштеп жатканыбызды дароо чечели. Биз тизмелерди массивдерге, тагыраак айтканда, саптардын тизмесин айландырабыз: I, love, learning, on, JavaRush ошол эле саптардын массивине айланат. Бирок, биринчиден, бир аз бонус. Келгиле, тизмени кантип тез жазуу керектиги жөнүндө сүйлөшөлү.
Массивге тизмени кантип тез жазуу керек
Эсиңизде болсун: бул жашоодо эки сценарий бар. Биринчиси, биз жаңы тизмени баштаганда өтө меланхолия жана зеригүү:List<String> wordsList = new ArrayList();
Анан ага баалуулуктарды кошобуз... Биринин артынан бири...
wordsList.add("I");
wordsList.add("love");
wordsList.add("learning");
wordsList.add("on");
wordsList.add("JavaRush");
Жакшы эмес. Мен тизмени түзүп жатканда эмне үчүн керек болгонун унутуп калыпмын! Экинчи жол - бардык керексиз нерселерди кесип, ... пайдалуу класстарды кабыл алуу. Мисалы, Arrays
абдан ыңгайлуу ыкмасы бар класс asList
. Сиз ага тизме түзгүңүз келген нерсени киргизе аласыз жана ыкма аны тизме кылат. Бул сыяктуу бир нерсе:
List<String> wordsList = Arrays.asList("I", "love", "learning", "on", "JavaRush");
Бул ыкма өзүнө алат varargs
- кандайдыр бир мааниде, массив. Кечирим сурайм, тизмеден массивге деп аталган лекцияда мен сизге массивди биринчи тизмектеп чыгууну үйрөткөм, бирок жагдайлар муну талап кылды. Эми тизмелерди массивдерге айландыруу ыкмаларыбызга.
Метод №1. Бюст
Бул ыкма клавиатурада көп ойлонбостон codeду терүүнү жакшы көргөндөр үчүн идеалдуу. Медитациянын бир түрү. 1-кадам. Тизме сыяктуу узундуктагы массивди түзүңүз:List<String> wordsList = Arrays.asList("I", "love", "learning", "on", "JavaRush");
String[] wordsArray = new String[wordsList.size()];
2-кадам. Тизменин бардык элементтерин кайталоо жана массив уячаларына индекс боюнча кире алуу үчүн эсептегич менен цикл түзүңүз:
for (int i = 0; i < wordsList.size(); i++) {
}
3-кадам. Циклдин ичинде i индекси бар тизмектин ар бир элементинин маанисин i индекси бар массив уячасына ыйгарабыз:
for (int i = 0; i < wordsList.size(); i++) {
wordsArray[i] = wordsList.get(i);
}
Натыйжа:
public static void main(String[] args) {
List<String> wordsList = Arrays.asList("I", "love", "learning", "on", "JavaRush");
String[] wordsArray = new String[wordsList.size()];
for (int i = 0; i < wordsList.size(); i++) {
wordsArray[i] = wordsList.get(i);
}
}
Метод №2. toArray ыкмасы
Балким, колдонуу үчүн эң оптималдуу нерсе. Интерфейстин учурдагы тизмеден массивди түзүүчүList
эки ыкмасы бар :toArray
Object[] toArray();
T[] toArray(T[] a);
Биринчи ыкма учурдагы тизменин бардык элементтерин камтыган an objectтердин массивин кайтарат (биринчиден акыркыга чейин):
public class Main {
public static void main(String[] args) {
List<String> wordsList = Arrays.asList("I", "love", "learning", "on", "JavaRush");
String[] wordsArray = (String[]) wordsList.toArray();
for (String word : wordsArray) {
System.out.println(word);
}
}
}
Келгиле, ыкманы иштетип main
, төмөнкүнү көрөлү:
I
love
learning
on
JavaRush
Бирок, бул ыкманын бир өзгөчөлүгү бар: ал ар дайым an objectтердин массивин кайтарат (Object[])
. Ошондуктан, кайтарылган натыйжа керектүү маалымат түрүнө чыгарылышы керек. Жогорудагы мисалда биз аны саптардын массивине чыгардык (String[])
. Бирок бул ыкма кээ бир жагдайларда ыңгайлуу болушу мүмкүн болгон аргументтерди кабыл алbyte. Экинчи ыкма ошондой эле учурдагы тизменин бардык элементтерин камтыган массивди кайтарат (биринчиден акыркыга чейин). Бирок, биринчиден айырмаланып, экинчи ыкма аргумент катары белгилүү бир типтеги массивди алат. Бирок экинчи ыкманын натыйжасы an objectтердин массиви эмес, белгилүү бир маалымат тибиндеги массив болот - аргумент катары берилген массив методундагы маалымат түрү сыяктуу.
public class Main {
public static void main(String[] args) {
List<String> wordsList = Arrays.asList("I", "love", "learning", "on", "JavaRush");
String[] wordsArray = wordsList.toArray(new String[0]);
for (String word : wordsArray) {
System.out.println(word);
}
}
}
Эгерде биз методду иштетсек main
, биз жыйынтыкта ошол эле сөздөрдү көрөбүз:
I
love
learning
on
JavaRush
ге аргумент катары берилген массив жөнүндө бир аз сүйлөшөлү toArray
. Методдун логикасы берилүүчү массивдин узундугуна жараша болот. Үч мүмкүн болгон сценарий бар:
1. Берилген массивдин узундугу тизменин узундугунан азыраак
Бул учурда, ыкма жаңы массивди түзөт жана ага тизменин элементтерин жайгаштырат. Муну биз жогорудагы мисалда көрсөттүк.2. Өткөрүлүп жаткан элементтин узундугу тизменин узундугуна барабар
Метод тизменин элементтерин өткөн массивге жайгаштырат. Муну көрсөтөлү:public class Main {
public static void main(String[] args) {
List<String> wordsList = Arrays.asList("I", "love", "learning", "on", "JavaRush");
// Создаем пустой массив нужной длины
String[] array = new String[wordsList.size()];
// Отправляем пустой массив в метод toArray
wordsList.toArray(array);
// Проверяем, заполнился ли наш массив. Спойлер: да
for (String word : array) {
System.out.println(word);
}
}
}
Чыгарып жатканда биз бирдей сызыктарды көрөбүз жана метод биз түзгөн массивди толтурганы айкын болот.
3. Берилген массивдин узундугу тизменин узундугунан чоңураак
Метод тизменин бардык элементтерин массивге жазат жана маанини акыркы кошулган элементтин жанындагы уячага жазатnull
. Муну көрсөтөлү:
public class Main {
public static void main(String[] args) {
List<String> wordsList = Arrays.asList("I", "love", "learning", "on", "JavaRush");
// Создаем пустой массив, длина которого в 2 раза больше длины списка
String[] array = new String[wordsList.size() * 2];
for (int i = 0; i < array.length; i++) {
// В каждую ячейку запишем строковое представление текущего индекса
array[i] = String.valueOf(i);
}
// Отправляем массив в метод toArray
wordsList.toArray(array);
// Проверяем, что лежит в нашем массиве
for (String word : array) {
System.out.println(word);
}
}
}
main
Консолдо методду иштеткенден кийин биз төмөнкүлөрдү көрөбүз:
I
love
learning
on
JavaRush
null
6
7
8
9
Үчөөнүн ичинен кайсынысын тандоо керек? Javaнын алгачкы versionларында узундугу тизменин узундугуна барабар же андан чоңураак массивди өткөрүү оптималдуу болгон. Бирок, заманбап JVMлердин оптималдаштыруулары бар жана кээ бир учурларда алар тизменин узундугуна караганда кыскараак узундуктагы массивден өткөн ыкма үчүн тезирээк иштешин камсыз кылат. Демек, сиз Javaнын заманбап versionсын иштетип жатсаңыз, биринчи мисалдагыдай ыкмага бош массивди өткөрүңүз:
wordsList.toArray(new String[0]);
Метод №3. Stream API
Бул ыкма тизмени массивге айландырууну гана эмес, ошондой эле жолдо бир нече башка маселелерди чечүүнү каалагандар үчүн ылайыктуу. Жана ошондой эле Java Stream API менен тааныш адамдар үчүн. JavaRush бул тема боюнча жакшы макаласы бар . Бул бөлүмдө биз агымдарды колдонуу менен бир нече мисалдарды карап чыгабыз. Агымдарды колдонуу менен тизмени массивге кантип айландыруу керек:public class Main {
public static void main(String[] args) {
List<String> wordsList = Arrays.asList("I", "love", "learning", "on", "JavaRush");
String[] strings = wordsList.stream()
.toArray(String[]::new);
for (String s : strings) {
System.out.println(s);
}
/*
Output:
I
love
learning
on
JavaRush
*/
}
}
Бирок, эгерде сиз жөн гана тизмени массивге чыгаруу керек болсо, анда муну toArray
№2 методдо сүрөттөлгөн ыкма менен жасаганыңыз жакшы. Бирок, эгер сиз тизмени массивге айландырууну гана эмес, ар бир элементте кандайдыр бир аракеттерди жасоону кааласаңыз, анда бул сиз үчүн эң туура жер. Келгиле, тизмени массивге айландырууга аракет кылалы, ошондуктан акыркы массивде бардык саптар чоң тамга менен жазылат:
public class Main {
public static void main(String[] args) {
List<String> wordsList = Arrays.asList("I", "love", "learning", "on", "JavaRush");
String[] strings = wordsList.stream()
.map(str -> str.toUpperCase())
.toArray(String[]::new);
for (String s : strings) {
System.out.println(s);
}
/*
Output:
I
LOVE
LEARNING
ON
JAVARUSH
*/
}
}
Бул жерде .map(str -> str.toUpperCase())
биз тизмедеги ар бир сап менен эмне кылуу керектигин аныктадык. Бул учурда, биз ар бир сапты чоң тамгага айландырууну чечтик, анан аны массивге чогултабыз. Stream API колдонуу ар бир маанини трансформациялоого гана эмес, аларды чыпкалоого да мүмкүндүк берет. Биз саптардын тизмесинен массив чогултгубуз келет дейли, бирок массивге эки символдон узунураак саптар гана кошулгандай кылып:
public class Main {
public static void main(String[] args) {
List<String> wordsList = Arrays.asList("I", "love", "learning", "on", "JavaRush");
String[] strings = wordsList.stream()
.filter(str -> str.length() > 2)
.map(str -> str.toUpperCase())
.toArray(String[]::new);
for (String s : strings) {
System.out.println(s);
}
/*
Output:
LOVE
LEARNING
JAVARUSH
*/
}
}
Бул жерде .filter(str -> str.length() > 2)
биз тизмектин ар бир элементине массивге киргенге чейин колдонула турган чыпка деп аталуучу нерсени түздүк. Бул учурда, ыкма ар бир сап үчүн чакырылат length()
жана эгер туюнтуунун натыйжасы str.length() > 2
чын болсо, мындай сап натыйжадагы тандоодо жана акырында массивде аяктайт. Болбосо, ал тийбейт. Бул жерде, балким, жөн эле элементтердин үстүнөн кайталоо жана ар кандай чектөөлөрдү киргизүү менен жетишүүгө болот деп айтууга болот. Сиз да ушундай кылсаңыз болот. Stream API мындай көйгөйлөрдү чечүү үчүн көбүрөөк функционалдык мамилени камсыз кылат.
Жыйынтыктар
Бул макалада биз тизмелерди массивдерге айландыруунун ар кандай жолдорун карап чыктык:- жөнөкөй издөө;
- ыкмасы
toArray;
- Stream API.
toArray
Эң жакшы вариант - интерфейсте аныкталган ыкманы колдонуу List
. Мындай эки ыкма бар:
Object[] toArray();
T[] toArray(T[] a);
GO TO FULL VERSION