JavaRush /Java блогы /Random-KK /Java тіліндегі жинақтар | Java жинақтары

Java тіліндегі жинақтар | Java жинақтары

Топта жарияланған
Сәлеметсіз бе! Соңғы бірнеше сабақта біз ArrayList-ті меңгеруде үлкен жетістіктерге жеттік. Дегенмен, осы уақыт ішінде біз ең қарапайым операцияларды орындадық: жою, кірістіру, консольге шығару. Әрине, бұл ArrayList пайдалану кезінде әзірлеушілер кездесетін мәселелер тізімінің соңы емес . Массивтер және массивтер сыныбы туралы лекция есіңізде ме ? Оны Java-ны жасаушылар бағдарламашылар массивтермен жұмыс істегенде жиі кездесетін мәселелерді шешу үшін арнайы әзірлеген. ArrayList туралы не деуге болады ? Әрине, оған тән тапсырмалар тізімі де бар. Олардың барлығы жекелеген сыныпта жүзеге асырылды ма, әлде біз қалаған әрекетті әр жолы қолмен жазуымыз керек пе? Әрине, бәрін өзіңіз жазудың қажеті жоқ. Java-да жинақтарды пайдалану кезінде орындалатын ең көп таралған операциялар Collections арнайы статикалық класында іске асырылған. Сынып жинақтары - 1

Java тіліндегі жинақтар

«Жинақтар» Java тіліндегі бірнеше деректер құрылымдарының жалпы атауы. Деректерді әртүрлі тәсілдермен сақтауға болады. Осы уақытқа дейін деректер массивте сақталатын ArrayList класын ғана зерттедік . Қалған жинақтармен кейінірек танысамыз. Енді Collections класы тек ArrayList-пен ғана емес, Java-дағы жинақтардың басқа түрлерімен де жұмыс істеуге арналғанын түсіну жеткілікті (демек, оның атауы). Сонымен, ArrayList-пен жұмыс істегенде Collections класы қандай тапсырмаларды шешуге мүмкіндік береді? Бірінші және ең айқын - сұрыптау. Массивтер туралы лекцияда біз сандармен мысалды қарастырдық, ал енді жолдармен мысалды қарастырайық. Жинақтардың мазмұнын сұрыптау үшін Collections класы келесі әдісті жүзеге асырады sort():
public class Main {

   public static void main(java.lang.String[] args) {

       String mercury = new String("Mercury");
       String venus = new String("Venus");
       String earth = new String("Earth");
       String mars = new String("Mars");
       String jupiter = new String("Jupiter");
       String saturn = new String("Saturn");
       String uranus = new String("Uranus");
       String neptune = new String("Neptune");

       ArrayList<String> solarSystem = new ArrayList<>(Arrays.asList(mercury, venus, earth, mars,
               jupiter, saturn, uranus, neptune));
       Collections.sort(solarSystem);
       System.out.println(solarSystem);

   }
}
Қорытынды:

[Венера, Земля, Марс, Меркурий, Нептун, Сатурн, Уран, Юпитер]
Жолдар алфавит бойынша сұрыпталды! Неліктен алфавиттік тәртіпте? Сынып Stringжолдардың бір-бірімен қалай салыстырылатынын анықтау үшін бағдарламаланған (дәл алфавит бойынша). Өзіңіз жасайтын сабақтар үшін сіз өзіңіздің салыстыру механизміңізді жүзеге асыра аласыз, бірақ бұл туралы басқа дәрістерде айтатын боламыз. Сонымен қатар, Collections класы ішіндегі ең аз және максималды элементті табуға мүмкіндік береді ArrayList. Бұл min()және әдістері арқылы жүзеге асырылады max():
public static void main(java.lang.String[] args) {

   ArrayList<Integer> numbers = new ArrayList<>(Arrays.asList(1,2,3,4,5,6,7));
   System.out.println(Collections.max(numbers));
   System.out.println(Collections.min(numbers));

}
Қорытынды:

7
1
Бұл, әрине, барлық элементтер арқылы өту және ең үлкен/ең кіші элементті іздеу үшін codeты қолмен жазудан әлдеқайда ыңғайлы :) Тағы бір өте пайдалы әдіс reverse(). Элементтер кері тәртіпте болатындай тізімді «кері» ету қажет болса, біз мұны қалай жасар едік? Мұндай алгоритмді өзіңіз жазу оңай емес шығар :) Бақытымызға орай, әдіс reverse()мұны қалай жасау керектігін біледі. Мысалы, бізге әдіс планеталарды алфавиттік ретпен сұрыптағанын ұнатпаймыз sort()және біз тәртіпті керісінше - Z-дан A-ға өзгерткіміз келеді:
public class Main {

   public static void main(java.lang.String[] args) {

       String mercury = new String("Mercury");
       String venus = new String("Venus");
       String earth = new String("Earth");
       String mars = new String("Mars");
       String jupiter = new String("Jupiter");
       String saturn = new String("Saturn");
       String uranus = new String("Uranus");
       String neptune = new String("Neptune");

       ArrayList<String> solarSystem = new ArrayList<>(Arrays.asList(mercury, venus, earth, mars,
               jupiter, saturn, uranus, neptune));
       Collections.sort(solarSystem);
       Collections.reverse(solarSystem);
       System.out.println(solarSystem);

   }
}
Қорытынды:

[Юпитер, Уран, Сатурн, Нептун, Меркурий, Марс, Земля, Венера]
Айтпақшы, бұл жерде біз жиі сұрыптау, элементтердің реті және т.б. Біздің міндетіміз керісінше болса ше? Мысалы, біз лотерея механизмін енгізуге тырысамыз. Біз катушкаға 100 нөмір қостық, олар экранда бір-бірден пайда болуы керек. Билетіндегі барлық сандарды бірінші сызып тастаған қатысушы жеңеді. Бұл әдісті пайдалана отырып, мұндай механизмді жүзеге асыру өте оңай shuffle():
public class Main {

   public static void main(java.lang.String[] args) {

       ArrayList<Integer> lottery = new ArrayList<>(100);
       for (int i = 1; i <= 100; i++) {

           lottery.add(i);//add numbers from 1 to 100 to the drum
       }

       Collections.shuffle(lottery);//mix
       System.out.println("Attention! The first 10 numbers appear from the drum!");
       for (int i = 0; i < 10; i++) {

           System.out.println(lottery.get(i));
       }

   }
}
Қорытынды:

Внимание! Из барабана появляются первые 10 чисел!
32
61
4
81
25
8
66
35
42
71
Бұл қарапайым! Мәселе шешілді, ал біздің ойынымыз жазылды :) Енді басқа жағдайды елестетейік. solarSystemБұған дейін біз онда тізімделген планеталармен тізім жасадық . Бұл бәрімізге ұнайтын сияқты, егер бір нәрсе болмаса: сіз одан элементтерді алып тастап, жаңаларын қоса аласыз! Бұл біз күткен мінез-құлық емес екені анық: біздің бағдарламамыздағы күн жүйесі өзгеріссіз күйде болуы керек. Жинақтар класының өте қызықты әдісі бар - unmodifiableList(). Ол берілген тізімнің өзгермейтін нұсқасын жасайды. Оған элемент қосу немесе жою мүмкін болмайды. Күн жүйесінің планеталарының тізімі жағдайында бұл бізге қажет нәрсе!
public class Main {

   public static void main(java.lang.String[] args) {

       String mercury = new String("Mercury");
       String venus = new String("Venus");
       String earth = new String("Earth");
       String mars = new String("Mars");
       String jupiter = new String("Jupiter");
       String saturn = new String("Saturn");
       String uranus = new String("Uranus");
       String neptune = new String("Neptune");

       List<String> solarSystem = Collections.unmodifiableList(new ArrayList<>(Arrays.asList(mercury, venus, earth, mars,
               jupiter, saturn, uranus, neptune)));
       solarSystem.add("Pluto");//try to add a new element
   }
}

Exception in thread "main" java.lang.UnsupportedOperationException
	at java.util.Collections$UnmodifiableCollection.add(Collections.java:1075)
	at Main.main(Main.java:21)
Қате: solarSystemенді ештеңе қоса алмайсыз! Бұл жағдайда назар аудару қажет жалғыз нәрсе - айнымалының түрі болуы керек List<>емес, ArrayList<>(бұл әдіс тізімдердің барлық түрлеріне ортақ дәл осы түрдегі нысанды қайтарады). Жұмыс кезінде орын алуы мүмкін тағы бір жалпы жағдай - бағдарламашы элементтерді дұрыс емес ретпен қосқан. Егер бұл орын алса және Меркурий мен Нептун күтпеген жерден орындарын ауыстырса, келесі әдіс бұл қатені түзетуге көмектеседі swap():
public class Main {

   public static void main(java.lang.String[] args) {

       String mercury = new String("Mercury");
       String venus = new String("Venus");
       String earth = new String("Earth");
       String mars = new String("Mars");
       String jupiter = new String("Jupiter");
       String saturn = new String("Saturn");
       String uranus = new String("Uranus");
       String neptune = new String("Neptune");

       ArrayList<String> solarSystem = new ArrayList<>(Arrays.asList(neptune, venus, earth, mars
       , jupiter, saturn, uranus, mercury));// wrong planet order
       System.out.println(solarSystem);

       Collections.swap(solarSystem, solarSystem.indexOf(mercury), solarSystem.indexOf(neptune));
       System.out.println(solarSystem);

   }
}
Біз тізімді әдіске swap(), сондай-ақ ауыстырылуы қажет екі элементтің индекстеріне бердік. Назар аударыңыз: әдіс сілтемелермен емес, арнайы индекстермен жұмыс істейді. Сондықтан бұл жерде бізге әдіс қажет болды ArrayList.indexOf(). Қорытынды:

[Нептун, Венера, Земля, Марс, Юпитер, Сатурн, Уран, Меркурий]

[Меркурий, Венера, Земля, Марс, Юпитер, Сатурн, Уран, Нептун]
Соңында, өте қызықты әдіспен танысайық - disjoint(). Ол екі топтамада қиылысулардың, яғни кем дегенде бір бірдей элементтің бар-жоғын тексереді. Олай болмаса, қайтарады true, иә болса, қайтарады false.
public class Main {

   public static void main(java.lang.String[] args) {

       String mercury = new String("Mercury");
       String venus = new String("Venus");
       String earth = new String("Earth");
       String mars = new String("Mars");
       String jupiter = new String("Jupiter");
       String saturn = new String("Saturn");
       String uranus = new String("Uranus");
       String neptune = new String("Neptune");

       ArrayList<String> solarSystemPart1 = new ArrayList<>(Arrays.asList(mercury, venus, earth, mars));
       ArrayList<String> solarSystemPart2 = new ArrayList<>(Arrays.asList(jupiter, saturn, uranus, neptune));

       System.out.println(Collections.disjoint(solarSystemPart1, solarSystemPart2));

   }
}
Көріп отырғаныңыздай, біздің екі тізімдегі элементтер мүлдем басқа, сондықтан бағдарлама шығады true. Бұл өте қызықты және өте пайдалы сабақ. Мысалы Arrays, ол бізге басқа нәрселерге назар аударуға мүмкіндік беретін көптеген күнделікті, қара жұмыстарды жасайды. Бұл туралы Oracle құжаттамасында оқыңыз , онда басқа әдістер бар.
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION