JavaRush /Java блогы /Random-KK /Массивтер класы және оның қолданылуы

Массивтер класы және оның қолданылуы

Топта жарияланған
Тағы да сәлем! :) Өткен сабақта біз массив (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) соңғы ұяшықта болуына кепілдік беріледі.

  • Енді индексі бар элементтен бастап, [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];
Сізде бұрыннан бар массивтер туралы білімді пайдалана отырып, мұны қалай жасайтындығыңызды ойлаңыз ба? Сіз, мысалы, массивті айналдыра аласыз 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 массивтері класы

Арнайы 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()массивтердің өзі әдісті жоққа шығармайды 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-ны жасаушылар бағдарламашылар жұмыс кезінде кездесетін көптеген типтік жағдайларды алдын ала көргенін және олар үшін тілде дайын шешімдерді енгізгенін бірнеше рет көресіз (және бұған қуанасыз). Бұл шешімдерді пайдалану дөңгелектерді қайта ойлап тапқаннан әлдеқайда оңай және ыңғайлы, солай емес пе? :) OracleArrays веб- сайтындағы сынып құжаттамасын міндетті түрде оқыңыз . Оқуларыңызға сәттілік!
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION