111. Saplaryň arasynda maglumatlary nädip alyşmaly?
Saplaryň arasynda maglumat alyşmak üçin köp dürli çemeleşmeleri we serişdeleri ulanyp bilersiňiz: mysal üçin atom üýtgeýjilerini, sinhron kolleksiýalary we semafor. Emma bu meseläni çözmek üçin Exchanger bilen mysal bererin . Exchanger , umumy sinhronizasiýa nokadyny döretmek arkaly jübüt sapaklaryň arasynda elementleriň alyş-çalşyny aňsatlaşdyrýan paketden sinhronizasiýa synpydyr . Ulanylyşy iki sapagyň arasynda maglumat alyş-çalşyny aňsatlaşdyrýar. Işleýiş usuly gaty ýönekeý: alyş-çalyş () usuly diýip iki aýry sapaga garaşýar . Olaryň arasynda alyş-çalyş nokady ýaly bir zat döredilýär: birinji sapak obýektini goýýar we beýlekisiniň obýektini alýar, ikinjisi bolsa öz gezeginde birinjiniň obýektini alýar we özüne degişlidir. .Agny, birinji sapak alyş-çalyş () usulyny ulanýar we başga bir sapak şol bir obýektdäki alyş-çalyş () usulyny çagyrýança we olaryň arasynda maglumat alyşýança işsiz bolýar . Mysal hökmünde, sapak synpynyň aşakdaky ýerine ýetirilişine serediň :public class CustomThread extends Thread {
private String threadName;
private String message;
private Exchanger<String> exchanger;
public CustomThread(String threadName, Exchanger<String> exchanger) {
this.threadName = threadName;
this.exchanger = exchanger;
}
public void setMessage(final String message) {
this.message = message;
}
@Override
public void run() {
while (true) {
try {
message = exchanger.exchange(message);
System.out.println(threadName + " поток получил сообщение: " + message);
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
Ip konstruktorynda, String görnüşindäki obýektleri kabul edýän Exchanger obýektini kesgitleýäris we işe başlanda (işleýiş usulynda ) şol alyş - çalyşda bu usuly ulanýan başga bir sapak bilen habar alyşmak üçin onuň alyş-çalşygyny ulanýarys . Esasy ýagdaýda işledeliň :
Exchanger<String> exchanger = new Exchanger<>();
CustomThread first = new CustomThread("Первый ", exchanger);
first.setMessage("Сообщение первого потока");
CustomThread second = new CustomThread("Второй", exchanger);
second.setMessage("Сообщение второго потока");
first.start();
second.start();
Konsol görkeziler:
112. “Thread” synpy bilen “Runnable” interfeýsiniň arasynda näme tapawut bar?
Ilki bilen belläp geçjek zadym, “Thread” synpdyr, “ Runnable” interfeýsdir, bu gaty açyk tapawut = D Şeýle hem, “Runnable ” (kompozisiýa) ulanýandygyny aýdaryn . .Agny, biziň iki ýolumyz bar:-
Sapakdan miras alyň , iş usulyny ýok ediň, soňra bu obýekti dörediň we sapagy başlangyç () usuly bilen başlaň .
-
“Runnable” -ni belli bir synpda ýerine ýetiriň , onuň run () usulyny ýerine ýetiriň we “ Runnable” interfeýsiniň bu obýektini ýerine ýetirijisine belläp, “ Thread” obýektini dörediň . Ahyrynda, başlangyç () usuly bilen mowzuk obýektini işe giriziň .
-
“Runnable ” interfeýsini durmuşa geçireniňizde , sapagyň özüni alyp barşyny üýtgetmersiňiz. Aslynda, sapagy işletmek üçin diňe bir zat berýärsiňiz. Bu bolsa öz gezegimizde gowy çemeleşme hasaplanýar.
-
“Runnable” -y durmuşa geçirmek synpyňyza has çeýeligi berýär. Eger mowzukdan miras alsaňyz , ýerine ýetirýän işiňiz hemişe sapakda bolar. Runöne “Runnable” -y durmuşa geçirseň, diňe bir sapak bolmaly däl. Galyberse-de, ony sapakda işledip ýa-da käbir ýerine ýetiriji hyzmatyna geçirip bilersiňiz. Bolýar, ýa-da diňe bir sapakly programmada mesele hökmünde bir ýere geçiriň.
-
“Runnable” -y ulanmak, meseläni ýerine ýetiriş sapaklaryny logika bilen logiki taýdan aýyrmaga mümkinçilik berýär.
-
Java-da diňe ýekeje miras bolup biler, şonuň üçin diňe bir synpy uzaldyp bolar. Şol bir wagtyň özünde, giňeldilip bilinýän interfeýsleriň sany çäksizdir (gowy, gaty çäklendirilmedik, ýöne 65535 , ýöne bu çäkden çykmak ähtimallygyňyz ýok).
113. T1, T2 we T3 sapaklary bar. Olary yzygiderli nädip durmuşa geçirmeli?
Kellä gelen ilkinji we iň ýönekeý zat, goşulmak () usulyny ulanmakdyr . Häzirki sapagyň (usul diýilýär) ýerine ýetirilmegini togtadýança ýerine ýetirilýär. Geliň, öz sapaklarymyzy durmuşa geçireliň:public class CustomThread extends Thread {
private String threadName;
public CustomThread(final String threadName){
this.threadName = threadName;
}
@Override
public void run() {
System.out.println(threadName + " - начал свою работу");
try {
// происходит некая логика
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(threadName + " - закончил свою работу");
}
}
Goşulmak () ulanyp, şeýle sapaklary birin-birin başlalyň :
CustomThread t1 = new CustomThread("Первый поток");
t1.start();
t1.join();
CustomThread t2 = new CustomThread("Второй поток");
t2.start();
t2.join();
CustomThread t3 = new CustomThread("Третий поток");
t3.start();
t3.join();
Konsol çykyşy:
Amaly meseleler
114. Matrisa diagonaly jem (Leetkod meselesi)
: Agdaýy: Esasy diagonalyndaky ähli elementleriň jemini we esasy diagonalyň bölegi bolmadyk goşmaça diagonaly elementleriň jemi hasaplaň. 1. Formanyň matrisasy bilen: mat = [[1,2,3], [4,5,6], [7,8,9]] Çykyş - 25 2. Matrisa bilen - mat = [[1,1, 1,1], [1,1,1,1], [1,1,1,1], [1,1,1,1]] Çykyş - 8 3. bolmaly matrisa - mat = [[5]] Netije bolmaly - 5 Okamagy duruzyň we kararyňyzy ýerine ýetiriň. Meniň çözgütim aşakdakylar bolar:public static int countDiagonalSum(int[][] matrix) {
int sum = 0;
for (int i = 0, j = matrix.length - 1; i < matrix.length; i++, j--) {
sum += matrix[i][i];
if (j != i) {
sum += matrix[i][j];
}
}
return sum;
}
Hemme zat massiwden bir geçiş bilen bolup geçýär, şol döwürde hasabat üçin iki indeksimiz bar: i - esasy diagonalyň sütünlerini we sütünlerini habar bermek üçin, j - goşmaça diagonalyň sütünlerini habar bermek üçin. Esasy diagonaly we goşmaça öýjük gabat gelýän bolsa, jem hasaplanylanda bahalaryň biri hasaba alynmaýar. Theagdaýdan matrisalary ulanyp barlalyň:
int[][] arr1 = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}};
System.out.println(countDiagonalSum(arr1));
int[][] arr2 = {
{1, 1, 1, 1},
{1, 1, 1, 1},
{1, 1, 1, 1},
{1, 1, 1, 1}};
System.out.println(countDiagonalSum(arr2));
int[][] arr3 = {{5}};
System.out.println(countDiagonalSum(arr3));
Konsol çykyşy:
115. Nollary süýşüriň (Leetcode kynçylygy)
: Agdaýy: Bitewi massiwde, nol däl elementleriň otnositel tertibini saklap, 0-yň hemmesini ahyryna geçiriň. 1. Bir massiw bilen: [0,1,0,3,12] Çykyş: [1,3,12,0,0] 2. Bir massiw bilen: [0] Çykyş: [0] Arakesmäň we kararymy ýazyň ... Kararym:public static void moveZeroes(int[] nums) {
int counterWithoutNulls = 0;
int counterWithNulls = 0;
int length = nums.length;
while (counterWithNulls < length) {
if (nums[counterWithNulls] == 0) {// находим нулевые элементы и увеличиваем счётчик
counterWithNulls++;
} else { // сдвигаем элементы на количество найденных нулевых элементов слева
nums[counterWithoutNulls++] = nums[counterWithNulls++];
}
}
while (counterWithoutNulls < length) {
nums[counterWithoutNulls++] = 0;// заполняем последние элементы массива нулями согласно счётчику нулей
}
}
Synag:
int[] arr1 = {1, 2, 0, 0, 12, 9};
moveZeroes(arr1);
System.out.println(Arrays.toString(arr1));
int[] arr2 = {0};
moveZeroes(arr2);
System.out.println(Arrays.toString(arr2));
Konsol çykyşy:
116. Berlen sanaw <String> atlary. Her atdan birinji harpy aýyryň we tertiplenen sanawy aýlaň
1. Ilki bilen kellä gelen zat , kolleksiýalar üçin köp kömekçi usullary öz içine alýan Kolleksiýalar synpynyň usullary:public static List<String> processTheList(List<String> nameList) {
for (int i = 0; i < nameList.size(); i++) {
nameList.set(i, nameList.get(i).substring(1));
}
Collections.sort(nameList);
return nameList;
}
2. Şeýle hem, Java wersiýasy 8 we has ýokary ulansak, çözgüdi diňe akymlar arkaly görkezmeli:
public static List<String> processTheList(List<String> nameList) {
return nameList.stream()
.map(x -> x.substring(1))
.sorted().collect(Collectors.toList());
}
Saýlanan çözgüdiň haýsydygyna garamazdan, çek aşakdaky ýaly bolup biler:
List<String> nameList = new ArrayList();
nameList.add("John");
nameList.add("Bob");
nameList.add("Anna");
nameList.add("Dmitriy");
nameList.add("Peter");
nameList.add("David");
nameList.add("Igor");
System.out.println(processTheList(nameList));
Konsol çykyşy:
117. Tertibi aýlaň
Çözgüt 1 Againene-de kellä gelen ilkinji zat, kömekçi peýdaly synp kolleksiýalarynyň usullaryny ulanmak . Aöne bir massiwimiz bolansoň, ilki bilen ony kolleksiýa (sanaw) öwürmeli:public static Integer[] reverse(Integer[] arr) {
List<Integer> list = Arrays.asList(arr);
Collections.reverse(list);
return list.toArray(arr);
}
Çözgüt 2 Sorag bir massiw bilen baglanyşyklydygy sebäpli, çözgüdi gutujykdan taýýar funksiýany ulanmazdan görkezmeli we klassiklere görä:
public static Integer[] reverse(Integer[] arr) {
for (int i = 0; i < arr.length / 2; i++) {
int temp = arr[i];
arr[i] = arr[arr.length - 1 - i];
arr[arr.length - 1 - i] = temp;
}
return arr;
}
Synag:
Integer[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9};
System.out.println(Arrays.toString(reverse(arr)));
Konsol çykyşy:
118. Setiriň palindromdygyny ýa-da ýokdugyny barlaň
Çözgüt 1 StringBuilder-i derrew ýatda saklamaly : adaty String bilen deňeşdirilende has çeýe we dürli usullara baý . Aýratynam ters usul bilen gyzyklanýarys :public static boolean isPalindrome(String string) {
string = string.toLowerCase(); //приводит всю строку к нижнему регистру
StringBuilder builder = new StringBuilder();
builder.append(string);
builder.reverse(); // перевочиваем строку методом Builder-а
return (builder.toString()).equals(string);
}
Çözgüt: Indiki çemeleşme gutulardan “boşluklary” ulanmazdan bolar. Setiriň arka tarapyndaky nyşanlary öňdäki degişli nyşanlar bilen deňeşdirýäris:
public static boolean isPalindrome(String string) {
string = string.toLowerCase();
int length = string.length();
int fromBeginning = 0;
int fromEnd = length - 1;
while (fromEnd > fromBeginning) {
char forwardChar = string.charAt(fromBeginning++);
char backwardChar = string.charAt(fromEnd--);
if (forwardChar != backwardChar)
return false;
}
return true;
}
Iki çemeleşmäni hem barlaýarys:
boolean isPalindrome = isPalindrome("Tenet");
System.out.println(isPalindrome);
Konsol çykyşy:
119. simpleönekeý sortlaşdyryş algoritmini ýazyň (Bubble, Selection ýa-da Shuttle). Nädip gowulaşdyryp bolar?
Durmuşa geçirmek üçin ýönekeý algoritm hökmünde saýlamany tertipleşdirmegi saýladym - Saýlama tertibi:public static void selectionSorting(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
int min = i;
for (int j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[min]) {
min = j; // выбираем минимальный элемент в текущем числовом отрезке
}
}
int temp = arr[min]; // меняем местами минимальный элемент с элементом под индексом i
arr[min] = arr[i]; // так How отрезок постоянно уменьшается
arr[i] = temp; // и выпадающие из него числа будут минимальными в текущем отрезке
} // и How итог - числа оставшиеся вне текущей итерации отсортированы от самого наименьшего к большему
}
Kämilleşdirilen wersiýa şeýle bolar:
public static void improvedSelectionSorting(int[] arr) {
for (int i = 0, j = arr.length - 1; i < j; i++, j--) { // рассматриваемый отрезок с каждой итерацией
// будет уменьшаться с ДВУХ сторон по одному элементу
int min = arr[i];
int max = arr[i];
int minIndex = i;
int maxIndex = i;
for (int n = i; n <= j; n++) { // выбираем min и max на текущем отрезке
if (arr[n] > max) {
max = arr[n];
maxIndex = n;
} else if (arr[n] < min) {
min = arr[n];
minIndex = n;
}
}
// меняем найденный минимальный элемент с позиции с индексом min на позицию с индексом i
swap(arr, i, minIndex);
if (arr[minIndex] == max) {// срабатывает, если элемент max оказался смещен предыдущей перестановкой -
swap(arr, j, minIndex); // на старое место min, поэтому с позиции с индексом min смещаем его на позицию j
} else {
swap(arr, j, maxIndex); // простое обмен местами элементов с индексами max и j
}
}
}
static int[] swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
return arr;
}
Bolýar, indi sortlamagyň hakykatdanam gowulaşandygyna göz ýetirmeli. Netijäni deňeşdireliň:
long firstDifference = 0;
long secondDifference = 0;
long primaryTime;
int countOfApplying = 10000;
for (int i = 0; i < countOfApplying; i++) {
int[] arr1 = {234, 33, 123, 4, 5342, 76, 3, 65,
3, 5, 35, 75, 255, 4, 46, 48, 4658, 44, 22,
678, 324, 66, 151, 268, 433, 76, 372, 45, 13,
9484, 499959, 567, 774, 473, 3, 32, 865, 67, 43,
63, 332, 24, 1};
primaryTime = System.nanoTime();
selectionSorting(arr1);
firstDifference += System.nanoTime() - primaryTime;
int[] arr2 = {234, 33, 123, 4, 5342, 76, 3, 65,
3, 5, 35, 75, 255, 4, 46, 48, 4658, 44, 22,
678, 324, 66, 151, 268, 433, 76, 372, 45, 13,
9484, 499959, 567, 774, 473, 3, 32, 865, 67, 43,
63, 332, 24, 1};
primaryTime = System.nanoTime();
improvedSelectionSorting(arr2);
secondDifference += System.nanoTime() - primaryTime;
}
System.out.println(((double) firstDifference / (double) secondDifference - 1) * 100 + "%");
Iki görnüşi hem bir siklde başlandy, sebäbi aýratyn aýlawlar bar bolsa, ýokardaky koddan tertiplemek, ikinji ýerde goýulandan has erbet netijeleri görkezerdi. Munuň sebäbi programmanyň “gyzýar” we soň biraz çalt işleýär. Topicöne mowzukdan azajyk gidýärin. Konsolda bu barlagdan bäş gezek geçensoň, öndürijiligiň ýokarlanandygyny gördüm: 36.41006735635892% 51.46131097160771% 41.88918834013988% 48.091980705743566% 37.120220461591444% Meniň pikirimçe, bu gaty gowy netije.
120. Göçme manyda int görnüşini göni baýt bilen düzmek üçin algoritm (hereketleriň yzygiderliligi) ýazyň. Memoryat bilen näme bolýandygyny düşündiriň
-
baýt bahasy int-e öwrülýär. Munuň üçin 1 baýt ýat bölünip berilmez, ýöne ähli int bahalary ýaly - 4, bu baha entek int stackde bolmasa. Eger bar bolsa, oňa baglanyşyk diňe kabul ediler.
-
Iki int bahasy goşular we üçünjisi alynar. Munuň üçin täze ýat bölümi bölüner - 4 baýt (ýa-da int stackden bar bolan gymmata salgylanma alynar).
Bu ýagdaýda iki intsiň ýady henizem saklanar we olaryň bahalary degişlilikde int stakasynda saklanar.
GO TO FULL VERSION