JavaRush /Java блогу /Random-KY /Массив классы жана анын колдонулушу

Массив классы жана анын колдонулушу

Группада жарыяланган
Дагы бир жолу салам! :) Акыркы сабакта биз массив (Java массиви) сыяктуу берorштер структурасы менен таанышып , массивдерди түзүүнү, аларды маалыматтар менен толтурууну үйрөндүк, ошондой эле алардын эстутумда сакталышын үйрөндүк. Бүгүн биз кээ бир тапшырмаларды жана массивдер менен иштөө мисалдарын карап чыгабыз, алар сиз реалдуу иште көп кездешет. Мисалы, мындай жагдайды элестетиңиз: бизде туш келди тартипте жазылган 10 сандан турган массив бар.
//array Java, example
int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};
Биздин милдет бул массивди өсүү тартибинде иреттөө: эң кичинеден эң чоң сандарга чейин. Акыр-аягы, ал төмөнкүдөй болушу керек:
[-234, -2, 16, 26, 35, 43, 80, 92, 99, 167]
Муну кантип кылабыз? Тапшырма анча маанилүү эмес, биз буга чейин мындай кылган эмеспиз :/ Кандайдыр бир идея? божомолдоого аракет кыл. Бул жерде биз эмне кыла алабыз, мисалы:
  • Массивдин бардык элементтерин кайталоо. Ар бир элементти кийинкиси менен салыштырыңыз ( [0]менен [1], [1]менен [2], [2]менен , [3]ж.б.). Эгерде учурдагы массив элементи кийинкисинен чоңураак болсо, биз аларды алмаштырып, кийинки элементке өтөбүз. Болбосо, ошол бойдон калтырып, уланта бериңиз.

  • Ошентип, массивдин элементтери аркылуу биринчи өткөндөн кийин эң чоң маани (167) акыркы уячада болууга кепилдик берилет.

  • Эми массивдин бардык элементтерин кайрадан карап чыгалы, индекси бар элементтен баштап [0], бирок акыркыга чейинки элементке чейин (эң чоң сан өз ордунда) жана ошол эле салыштырууларды жана алмаштырууларды жасайлы. 
    Акырында, акыркы уячада биз экинчи эң жогорку мааниге ээ болобуз (99).

  • Келгиле, бул ишти массивде минус бир элементтерибиз канча жолу кайталайлы.
Массивдер классы жана анын колдонулушу - 2Биз идея менен келдик, codeду жазуу гана калды. Ал мындай болот:
public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       for (int i = numbers.length - 1; i > 0; i--) {
           for (int j = 0; j < i; j++) {
           /* Compare the elements in pairs,
             if they are in the wrong order,
             then swap them */
               if (numbers[j] > numbers[j + 1]) {
                   int tmp = numbers[j];
                   numbers[j] = numbers[j + 1];
                   numbers[j + 1] = tmp;
               }
           }
       }

   }
}
Мм... Бир аз татаал көрүнөт -_- Иштин жалпы принциби түшүнүктүү болсо да, мындай жөнөкөй көрүнгөн ишти чечүү үчүн бир топ code жазууга туура келет. Макул, балким биз өзүбүзгө ашыкча баа бергендирбиз? Мүмкүн, алган милдетибиз ушул убакка чейин биз үчүн өтө оор. Келгиле, жөнөкөй нерсе кылганга аракет кылалы. Мисалы, ошол эле сандар массивдерин алалы.
int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};
Биздин милдет анын мазмунун башка массивге көчүрүү.
int [] numbersCopy = new int[10];
Сизде бар массивдер жөнүндөгү бorмди колдонуп, муну кантип жасамак элеңиз жөнүндө ойлонуп көрүңүз? Сиз, мисалы, массивди айлантып numbers, анын элементтерин бир-бирден төмөнкүгө жаза аласыз numbersCopy:
public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       int [] numbersCopy = new int[10];

       for (int i = 0; i < numbers.length; i++) {

           numbersCopy[i] = numbers[i];
       }

   }
}
Ооба, биз аздыр-көптүр аткардык! Маселе чечилди окшойт, бирок дагы бир жолу: эгер аны тез-тез аткаруу керек болсо, codeдо бир топ окшош циклдер болот. Чынында, бул жана башка көйгөйлөр Java түзүүчүлөрү тарабынан эчак эле чечorп келген жана бизге "дөңгөлөктү кайра ойлоп табуунун" жана өзүбүздүн чечимибиз үчүн кандайдыр бир code жазуунун кереги жок.

Java Arrays классы

Атайын Java классы массивдер менен иштөөдө типтүү маселелерди чечүүгө жардам берет - Arrays. Бул класска Java программисттери өз ишинде кездешүүчү эң кеңири таралган көйгөйлөрдү чечүү үчүн методдор кошулган. Мисалы, биз өзүбүз чечүүгө аракет кылган массивди сорттоо тапшырмасын бир сапта чечсе болот:
public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       Arrays.sort(numbers);

       System.out.println(Arrays.toString(numbers));

   }
}
Метод Arrays.sort()массивди иреттейт. Андан тышкары, ага камтылган алгоритм муну биз жазган codeдон алда канча натыйжалуу кылат. Консолдук чыгаруу:

[-234, -2, 16, 26, 35, 43, 80, 92, 99, 167]
Эскертүү: массивди сапка айландыруу үчүн биз класстын башка ыкмасын колдондук Arrays- Arrays.toString(). Java массивдери toString(). _ Андыктан жөн эле жазсаңыз
System.out.println(numbers.toString());
toString()класс ыкмасы деп аталат Object. Массивдердин учурда, чыгаруу төмөнкүдөй болот:

[I@4554617c
Эми биз тыянак эмне үчүн мындай деп майда-чүйдөсүнө чейин кирбейбиз, негизгиси, бул бизге керек эмес. Бирок Arrays.toString() биз каалаган нерсени кылды. Баса, көчүрүү маселеси класста оңой чечилет Arrays:
public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       int [] numbersCopy = Arrays.copyOf(numbers, numbers.length);
       System.out.println(Arrays.toString(numbersCopy));

   }
}
Методго Arrays.copyOf()биз баштапкы массивибизди (анындан баалуулуктарды көчүрүп алышыбыз керек) жана маалыматтарды көчүргөн жаңы массивдин узундугун өткөрүп беребиз. Бул учурда, биз узундугу катары көрсөттү numbers.length, анткени Биз бүт массивди көчүргүбүз келет. Эгерде биз биринчи бир нече элементтерди гана көчүргүбүз келсе, жаңы массив үчүн кичирээк узундукту көрсөтө алабыз:
public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       int [] numbersCopy = Arrays.copyOf(numbers, 4);
       System.out.println(Arrays.toString(numbersCopy));

   }
}
Бул жерде биз жаңы массивдин узундугун 4 деп белгиледик. Демек, numbersжаңы массивге биринчи 4 элемент гана көчүрүлөт. Консолдук чыгаруу:

[167, -2, 16, 99]
Айтмакчы, эгер сиз массивдин бир бөлүгүн көчүрүшүңүз керек болсо, бирок башынан эмес, “ортосунан” көчүрүшүңүз керек болсо, Arraysсиз муну да жасай аласыз:
public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       int [] numbersCopy = Arrays.copyOfRange(numbers, 2,6);
       System.out.println(Arrays.toString(numbersCopy));

   }
}
Жыйынтык:

[16, 99, 26, 92]
Жаңы массивге эки ( кошулган ) уячалардан алтыга ( кошкон эмес ) чейинки сандар көчүрүлдү. Мындан тышкары, биз бири-бири менен эки массивди салыштыруу керек болушу мүмкүн. Методдогудай эле toString()массивдердин өздөрү методду жокко чыгарbyte equals(). Ошентип, аларды мындайча салыштырууга аракет кылсак:
public class Main {

   public static void main(String[] args) {

       int[] numbers = {1, 2, 3};
       int[] numbers2 = {1, 2, 3};

       System.out.println(numbers.equals(numbers2));
   }
}
биз жыйынтык алабыз false. Object.equals()Анткени, шилтемелерди салыштырган ыкма деп аталат . Анан, албетте, алар ар түрдүү! Бирок биз шилтемелерди эмес, массивдердин мазмунун салыштырышыбыз керек. Класста бизге керектүү нерсени так аткарган Arraysжокко чыгарылган метод бар :equals()
public class Main {

   public static void main(String[] args) {

       int[] numbers = {1, 2, 3};
       int[] numbers2 = {1, 2, 3};

       System.out.println(Arrays.equals(numbers, numbers2));
   }
}
Жыйынтык:

true
Айтмакчы, класс Arraysкадимки массивдер менен гана эмес, эки өлчөмдүү массивдер менен да ийгorктүү иштейт:
public class Main {

   public static void main(String[] args) {

       int[][] numbers = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};

       int[][] numbersCopy = Arrays.copyOf(numbers, numbers.length);

       System.out.println("Are these two-dimensional arrays equal to each other?");
       System.out.println(Arrays.deepEquals(numbers, numbersCopy));

       System.out.println(Arrays.deepToString(numbersCopy));
   }
}
Жыйынтык:

Равны ли эти двумерные массивы между собой?
true
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Көрүнүп тургандай, ыкма Arrays.copyOf()эки өлчөмдүү массивди көчүрүү менен күрөшкөн. Бул учурда, эки өлчөмдүү массивди көчүрүп жатканда, "тайыз көчүрмө" деп аталган нерсе пайда болоорун эске алыңыз. Ал эми эки өлчөмдүү массивдерди салыштыруу жана аларды консолго чыгаруу үчүн атайын методдор каралган - deepEqualsжана deepToString(); Келечекте, сиз бир эмес, бир нече жолу көрөсүз (жана буга кубанасыз) Java жаратуучулары программисттер иштеп жаткан кездеги көптөгөн типтүү кырдаалдарды алдын ала көрүшкөн жана алар үчүн тилде даяр чечимдерди ишке ашырышкан. Бул чечимдерди колдонуу дөңгөлөктөрдү кайра ойлоп табуудан алда канча жеңил жана ыңгайлуу, туурабы? :) OracleArrays веб- сайтындагы класстын documentтерин окуп чыгыңыз . Сиздин изилдөө менен ийгorк коштосун!
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION