JavaRush /Java блогу /Random-KY /Javaдагы жыйнактар | Java жыйнактары

Javaдагы жыйнактар | Java жыйнактары

Группада жарыяланган
Салам! Акыркы бир нече сабактарда биз ArrayListти өздөштүрүү боюнча чоң ийгorктерге жетиштик. Бирок, бул убакыттын ичинде биз эң жөнөкөй гана операцияларды аткардык: өчүрүү, киргизүү, консолго чыгаруу. Албетте, бул ArrayListти колдонууда иштеп чыгуучулар туш болгон көйгөйлөрдүн тизмегинин аягы эмес . Массивдер жана Массивдер классы жөнүндө лекцияны эстейсизби ? Ал Java түзүүчүлөрү тарабынан массивдер менен иштөөдө программисттер кездешүүчү жалпы көйгөйлөрдү чечүү үчүн иштелип чыккан. ArrayList жөнүндө эмне айтууга болот ? Албетте, ал үчүн да типтүү тапшырмалардын тизмеси бар. Алардын баары өзүнчө класста ишке ашырылганбы же биз каалаган жүрүм-турумду ар бир жолу кол менен жазууга туура келеби? Албетте, баарын өзүң жазуунун кереги жок. Java'да коллекцияларды колдонууда аткарылуучу эң кеңири таралган операциялар Collections атайын статикалык классында ишке ашырылган. Класс жыйнактары - 1

Java тorндеги жыйнактар

"Жыйнактар" Java бир нече маалымат структураларынын жалпы аталышы. Маалыматтар ар кандай жолдор менен сакталышы мүмкүн. Азырынча биз маалыматтар массивде сакталган ArrayList классын гана изилдедик. Калган коллекциялар менен кийинчерээк таанышабыз. Эми Collections классы ArrayList менен гана эмес, Javaдагы коллекциялардын башка түрлөрү менен да иштөө үчүн иштелип чыкканын түшүнүү жетиштүү (демек, анын аты). Ошентип, Collections классы ArrayList менен иштөөдө кандай тапшырмаларды чечүүгө мүмкүндүк берет? Биринчи жана эң айкын - сорттоо. Массивдер боюнча лекцияда биз сандар менен мисалды карадык, эми саптар менен болгон мисалды карап көрөлү. Коллекциялардын мазмунун сорттоо үчүн 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дан Ага өзгөрткүбүз келет:
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
Бул жөнөкөй! Көйгөй чечorп, оюнубуз жазылды :) Эми башка жагдайды элестетип көрөлү. solarSystemБуга чейин биз анда тизмеленген планеталар менен тизме түзгөнбүз . Жана бул баарыбызга ылайыктуу окшойт, эгерде бир нерсе болбосо: сиз андан элементтерди алып салып, жаңыларын кошсоңуз болот! Бул, албетте, биз күткөн жүрүм-турум эмес: биздин программадагы күн системасы өзгөрүүсүз абалда болушу керек. Collections классынын абдан кызыктуу ыкмасы бар - unmodifiableList(). Ал берилген тизменин өзгөрбөс versionсын түзөт. Ага элемент кошуу же алып салуу мүмкүн болбой калат. Күн системасынын планеталарынын тизмесине келсек, дал ушул нерсе бизге керек!
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<>(бул ыкма тизмелердин бардык түрлөрү үчүн жалпы так ушул типтеги an objectти кайтарат). Жумуш учурунда болушу мүмкүн болгон дагы бир жалпы жагдай - программист элементтерди туура эмес тартипте кошкон. Эгер бул болуп, Меркурий менен Нептун күтүлбөгөн жерден орун алмашса, анда төмөнкү ыкма бул катаны оңдоого жардам берет 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(). Ал эки коллекциянын кесorштери, башкача айтканда, жок дегенде бир окшош элементи бар-жогун текшерет. Эгер жок болсо, кайтарат 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 documentтеринен окуңуз , ал жерде башка ыкмалар бар.
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION