JavaRush /Блоги Java /Random-TG /Синфи массивҳо ва истифодаи он

Синфи массивҳо ва истифодаи он

Дар гурӯҳ нашр шудааст
Боз салом! :) Дар дарси охир мо бо чунин сохтори додаҳо ба мисли массив (Java массив) шинос шудем, тарзи сохтани массивҳо, пур кардани онҳо бо маълумотро омӯхтем ва инчунин фаҳмидем, ки чӣ тавр онҳо дар хотира нигоҳ дошта мешаванд. Имрӯз мо якчанд вазифаҳо ва мисолҳои кор бо массивҳоро дида мебароем, ки шумо аксар вақт дар кори воқеӣ дучор мешавед. Масалан, ин вазъиятро тасаввур кунед: мо массиви 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) кафолат дода мешавад, ки дар ячейкаи охирин ҷойгир аст.

  • Акнун биёед бори дигар аз элементи дорои index сар карда, тамоми унсурҳои массивро аз назар гузаронем [0], вале то элементи пеш аз охирин (шумораи калонтарин аллакай дар ҷои худ аст) ва ҳамон муқоиса ва ивазкуниро анҷом диҳем. 
    Дар охир, дар ячейкаи охирини охирин мо арзиши дуюми баландтаринро (99) хоҳем дошт.

  • Биёед ин корро чанд маротиба такрор кунем, ки дар массив элементҳои минус як дошта бошанд.
Синфи массивҳо ва истифодаи он - 2Мо идеяро ба миён овардем, танҳо навиштани рамз боқӣ мемонад. Ин чунин хоҳад буд:
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];
Дар бораи он фикр кунед, ки чӣ тавр шумо бо истифода аз дониш дар бораи массивҳое, ки аллакай доред, ин корро мекунед? Шумо метавонед, масалан, як массивро давр занед 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 кайҳо ҳал кардаанд ва ба мо лозим нест, ки «чархро аз нав ихтироъ кунем» ва барои ҳалли худамон ягон 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 муайян кардем. Мувофиқи он танҳо 4 элементи аввал numbersба массиви нав нусхабардорӣ карда мешаванд. Натиҷаи консол:

[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(), массивҳо худашон методро бекор намекунанд 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на танҳо бо массивҳои оддӣ, балки бо массивҳои дученака низ бомуваффақият кор мекунад:
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 бисёр ҳолатҳои маъмулиро, ки барномасозон ҳангоми кор бо онҳо дучор мешаванд, пешгӯӣ кардаанд ва барои онҳо дар забон қарорҳои тайёрро амалӣ кардаанд. Истифодаи ин қарорҳо нисбат ба ихтироъ кардани чархҳо хеле осонтар ва қулайтар аст, дуруст? Arrays:) Ҳатман ҳуҷҷатҳои синфро дар вебсайти Oracle хонед . Муваффақият дар таҳсилатон!
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION