Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «Ѐилософия Java3Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 98

Автор Π‘Ρ€ΡŽΡ ЭккСль

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ класс Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ Comparable, Π° для дСмонстрации совмСстимости ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Java Arrays.sort():

//: arrays/CompType.java

// РСализация классом интСрфСйса Comparable.

import java.util.*;

import net.mindview.util.*;

import static net.mindview.util.Print.*;

public class CompType implements Comparable<CompType> { int i. int j;

private static int count = 1; public CompType(int nl, int n2) { i = nl; J = n2;

}

public String toStringO {

String result = "[i = " + i + J = " + j + "]"; if(count++ % 3 == 0)

result += "\n"; return result;

}

public int compareTo(CompType rv) {

return (i < rv.i ? -1 : (i == rv.i ? 0 : 1));

}

private static Random r = new Random(47); public static Generator<CompType> generatorO { return new Generator<CompType>() { public CompType nextO {

return new CompType(r.nextInt(100),r.nextInt(100));

}

}:

}

public static void main(String[] args) { CompType[] a =

Generated, array (new CompType[12], generatorO); print("ΠΏΠ΅Ρ€Π΅Π΄ сортировкой;"); pri nt(Arrays.toStri ng(a)); Arrays.sort(a); print("послС сортировки;");

print(Arrays.toString(a)); ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅ &

}

} /* Output: ΠΏΠ΅Ρ€Π΅Π΄ сортировкой:

[[1 = 58, j = 55], [i = 93. j = 61]. [i =61. j = 29] . [i = 68, j = 0], [i = 22, j = 7]. [i = 88, j = 28] , [i = 51, j = 89], [i = 9, j = 78], [i = 98. j = 61]

, [i = 20, j = 58]. [i = 16, j = 40], [i - 11. j - 22] ]

послС сортировки:

CCi = 9. j = 78], [i - 11. j - 22], [i - 16. j - 40]

. [i = 20. j = 58]. [i = 22, j = 7]. [i = 51. j = 89]

. [i = 58. j = 55]. [i =61. j = 29]. [i = 68. j = 0]

. [i = 88. j = 28]. [i = 93. j = 61]. [i = 98. j = 61] ]

*///:-

ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ сравнСния, Π²Ρ‹ нСсСтС ΠΏΠΎΠ»Π½ΡƒΡŽ ΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π΅Π½Π½ΠΎΡΡ‚ΡŒ Π·Π° принятиС Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΎ Π΅Π³ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°Ρ…. Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π² сравнСнии ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ значСния i, Π° значСния j ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ.

ΠœΠ΅Ρ‚ΠΎΠ΄ generator() ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠΉ интСрфСйс Generator, создавая Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹ΠΉ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ класс. ΠžΠ±ΡŠΠ΅ΠΊΡ‚ строит ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ CompType, инициализируя ΠΈΡ… случайными значСниями. Π’ main() Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ заполняСт массив CompType, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π°Ρ‚Π΅ΠΌ сортируСтся. Если интСрфСйс Comparable Π½Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½, Ρ‚ΠΎ ΠΏΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ Π²Ρ‹Π·ΠΎΠ²Π° sort() ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ClassCastException. Π­Ρ‚ΠΎ ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚ΡΡ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ sort() ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ свой Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΊ Ρ‚ΠΈΠΏΡƒ Comparable.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ класс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ интСрфСйс Comparable... Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚, Π½ΠΎ Π²Π°ΠΌ Π½Π΅ нравится, ΠΊΠ°ΠΊ ΠΎΠ½ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, ΠΈ Π²Ρ‹ Ρ…ΠΎΡ‚Π΅Π»ΠΈ Π±Ρ‹ Π·Π°Π΄Π°Ρ‚ΡŒ для Ρ‚ΠΈΠΏΠ° Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ сравнСния. Для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ создаСтся ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ класс, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠΉ интСрфСйс Comparator. Он содСрТит Π΄Π²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, compare() ΠΈ equals(). Π’ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, Π²Π°ΠΌ практичСски Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ придСтся Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ equals() β€” Ρ€Π°Π·Π²Π΅ Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ особых трСбованиях ΠΏΠΎ Π±Ρ‹ΡΡ‚Ρ€ΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΈΡŽ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ любой создаваСмый класс нСявно наслСдуСт ΠΎΡ‚ класса Object ΠΌΠ΅Ρ‚ΠΎΠ΄ equals().

Класс Collections содСрТит ΠΌΠ΅Ρ‚ΠΎΠ΄ reverseOrder(), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ создаСт Comparator для порядка сортировки, ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ ΠΏΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡŽ ΠΊ СстСствСнному. Он ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ ΠΊ CompType:

//: arrays/Reverse.java

// ΠœΠ΅Ρ‚ΠΎΠ΄ Col lections.reverseOrderO

import java util *;

i mport net.mi ndvi ew.uti1.*,

import static net.mindview.util.Print.*;

public class Reverse {

public static void main(String[] args) { CompTypeC] a = Generated.array(

new CompType[12], CompType generatorO); print("ΠΏΠ΅Ρ€Π΅Π΄ сортировкой "); print(Arrays.toString(a)). Arrays.sort(a. Col lections. reverseOrderO). print("послС сортировки:"); pri nt(Arrays.toStri ng(a));

} /* Output: ΠΏΠ΅Ρ€Π΅Π΄ сортировкой:

[[i = 58. j = 55]. [i = 93. j = 61]. [i =61. j = 29] . [i = 68. j = 0]. [i = 22. j = 7]. [i - 88. j - 28] . [i = 51. j = 89]. [i = 9. j = 78]. [i = 98. j = 61]

. [i = 20. j = 58]. [i =16. j = 40]. [i - 11. j - 22] ]

послС сортировки:

[[i - 98. j - 61]. [i =93. j = 61]. [i =88. j = 28] . [i = 68. j = 0]. [i = 61. j = 29]. [i = 58. j = 55] . [i = 51. j = 89]. [i = 22. j = 7]. [i = 20. j = 58]

. [i = 16. j = 40]. [i = 11. j = 22]. [i = 9. j = 78] ]

*///:-

НаконСц, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Comparator. Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ CompType ΡΡ€Π°Π²Π½ΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΏΠΎ значСниям]' вмСсто i:

//: arrays/ComparatorTest.java

// РСализация Comparator

import java.util.*:

import net.mindview.util.*:

import static net.mindview.util.Print.*:

class CompTypeComparator implements Comparator<CompType> { public int compare(CompType ol. CompType o2) {

return (ol.j < o2.j ? -1 : (ol.j == o2.j ? 0 : 1)):

}

}

public class ComparatorTest {

public static void main(String[] args) { CompTypeC] a = Generated.array(

new CompType[12], CompType.generatorO); print("ΠΏΠ΅Ρ€Π΅Π΄ сортировкой:"): print(Arrays.toString(a)): Arrays.sort(a. new CompTypeComparatorO); print("послС сортировки:"): print(Arrays.toString(a));

}

} /* Output: ΠΏΠ΅Ρ€Π΅Π΄ сортировкой:

[[i = 58. j = 55]. [i = 93. j = 61]. [i = 61. j = 29] . [i = 68. j = 0]. [i = 22. j = 7]. [i = 88. j = 28] . [i = 51. j = 89]. [i = 9. j = 78]. [i = 98. j = 61]

. [i = 20. j = 58]. [i = 16. j = 40]. [i = 11. j = 22] ]

послС сортировки:

[[1 = 68. j = 0]. [i = 22. j = 7]. [i - 11. j - 22]

. [i = 88. j = 28]. [i = 61. j = 29]. [i = 16. j = 40]

. [i = 58. j = 55]. [i = 20. j = 58]. [i = 93. j = 61]

. [i = 98. j = 61]. [i = 9. j = 78]. [i = 51. j = 89] ]

Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ° массива

ВстроСнныС срСдства сортировки ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΎΡ‚ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ любой массив ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΎΠ², любой массив ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΡ… Comparable ΠΈΠ»ΠΈ ассоциированных с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ Comparator1. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ случайныС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ String ΠΈ сортируСт ΠΈΡ…:

//: arrays/StringSorting.java // Sorting an array of Strings, import java.util *; import net.mindview.util.*, import static net.mindview.util.Print *; public class StringSorting {

public static void main(String[] args) {

String[] sa = Generated.array(new String[20],

new RandomGenerator String(5)), print("Before sort. " + Arrays toString(sa)); Arrays sort(sa);

print("After sort. " + Arrays toString(sa)), Arrays.sort(sa, Collections reverseOrder()); print("Reverse sort. " + Arrays toString(sa)); Arrays sort(sa, String CASE_INSENSITIVE_ORDER). print("Case-insensitive sort- " + Arrays toString(sa));

}

} /* Output-

Before sort [YNzbr. nyGcF, OWZnT, cQrGs, eGZMm, JMRoE, suEcU, OneOE, dLsmw, HLGEa,

hKcxr, EqUCB. bklna, Mesbt, WHkjU. rUkZP, gwsqP, zDyCy, RFJQA, HxxHv]

After sort- [EqUCB, HLGEa. HxxHv. JMRoE. Mesbt, OWZnT, OneOE, RFJQA, WHkjU, YNzbr,

bklna, cQrGs, dLsmw, eGZMm, gwsqP, hKcxr, nyGcF, rUkZP. suEcU. zDyCy]

Reverse sort: [zDyCy. suEcU, rUkZP, nyGcF. hKcxr, gwsqP, eGZMm, dLsmw. cQrGs, bklna.

YNzbr. WHkjU, RFJQA, OneOE, OWZnT, Mesbt. JMRoE. HxxHv, HLGEa, EqUCB]

Case-insensitive sort, [bklna. cQrGs. dLsmw, eGZMm, EqUCB, gwsqP, hKcxr, HLGEa, HxxHv,

JMRoE. Mesbt. nyGcF, OneOE. OWZnT. RFJQA. rUkZP. suEcU. WHkjU. YNzbr. zDyCy] *///.-

Π’ Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° сортировки String бросаСтся Π² Π³Π»Π°Π·Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ являСтся лСксикографичСским, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ всС слова, Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΠ΅ΡΡ с прописных Π±ΡƒΠΊΠ², ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π»ΡŽΠ±Ρ‹ΠΌ словам, Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΠΌΡΡ со строчных Π±ΡƒΠΊΠ². Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ слова Π³Ρ€ΡƒΠΏΠΏΠΈΡ€ΠΎΠ²Π°Π»ΠΈΡΡŒ нСзависимо ΠΎΡ‚ рСгистра символов, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Ρ€Π΅ΠΆΠΈΠΌ String.CASE_INSENSITIVE_ORDER, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² послСднСм Π²Ρ‹Π·ΠΎΠ²Π΅ sort() ΠΈΠ· ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°.

Алгоритм сортировки, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ Java, спроСктирован Π² расчСтС Π½Π° ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ для сортируСмого Ρ‚ΠΈΠΏΠ° β€” быстрая сортировка для ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΎΠ², надСТная сортировка слияниСм для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². ΠžΠ±Ρ‹Ρ‡Π½ΠΎ Π²Π°ΠΌ Π½Π΅ приходится Π±Π΅ΡΠΏΠΎΠΊΠΎΠΈΡ‚ΡŒΡΡ ΠΎ быстродСйствии, Ссли Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΎΡ„Π°ΠΉΠ»Π΅Ρ€ Π½Π΅ ΡƒΠΊΠ°ΠΆΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ процСсс сортировки Ρ‚ΠΎΡ€ΠΌΠΎΠ·ΠΈΡ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

Поиск Π² отсортированном массивС

ПослС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ массив Π±ΡƒΠ΄Π΅Ρ‚ отсортирован, Π²Ρ‹ смоТСтС быстро Π½Π°ΠΉΡ‚ΠΈ Π½ΡƒΠΆΠ½Ρ‹ΠΉ элСмСнт ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ Arrays.binarySearchQ. ΠŸΠΎΠΏΡ‹Ρ‚ΠΊΠ° Π²Ρ‹Π·ΠΎΠ²Π° binarySearchQ для нСсортированного массива ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ нСпрСдсказуСмым послСдствиям. Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ RandomGenerator.Integer заполняСт массив, послС Ρ‡Π΅Π³ΠΎ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для получСния искомых Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ:

//. arrays/ArraySearching java

// Using Arrays binarySearch()

import java util *;

import net.mindview util *;

import static net mindview.util Print *.

public class ArraySearching {

public static void main(String[] args) { Generator<Integer> gen =

new RandomGenerator.Integer(1000). int[] a = ConvertTo primitive(

Generated.array(new Integer[25], gen)). Arrays sort(a).

Ρ€Π³Π¨Π‘ΠžΡ‚ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ массив: " + Arrays toString(a)). while(true) {

int r = gen.nextO.

int location = Arrays binarySearch(a, r). if(location >= 0) {

pnnt("Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ " + r + " находится Π² ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ " +

location +

a[" + location + "] = " + a[location]); break. // Π’Ρ‹Ρ…ΠΎΠ΄ ΠΈΠ· Ρ†ΠΈΠΊΠ»Π° while

}

} /* Output

ΠžΡ‚ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ массив- [128. 140. 200. 207. 258. 258. 278. 288, 322. 429. 511. 520.

522. 551. 555. 589. 693. 704. 809. 861. 861. 868. 916. 961. 998]

Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 322 находится Π² ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ 8. Π°[8] = 322

*/// ~

Π¦ΠΈΠΊΠ» while Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ случайныС значСния ΠΊΠ°ΠΊ искомыС Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ΠΎΠ΄Π½ΠΎ ΠΈΠ· Π½ΠΈΡ… Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ Π² массивС.

Если искомоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ, ΠΌΠ΅Ρ‚ΠΎΠ΄ Arrays.binarySearchQ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½Π΅ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС возвращаСтся ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π΅Π΅ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ элСмСнта ΠΏΡ€ΠΈ вставкС (ΠΏΡ€ΠΈ сохранСнии сортировки массива). Если массив содСрТит ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰ΠΈΠ΅ΡΡ значСния, Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ поиска Π½Π΅ Π΄Π°Π΅Ρ‚ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠΉ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊΠΎΠΉ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΈΠ· Π΄ΡƒΠ±Π»ΠΈΠΊΠ°Ρ‚ΠΎΠ² Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½. Алгоритм проСктировался Π½Π΅ для ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ Π΄ΡƒΠ±Π»ΠΈΠΊΠ°Ρ‚ΠΎΠ², Π° для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅Π½ΠΎΡΠΈΡ‚ΡŒ ΠΈΡ… присутствиС. Если Π²Π°ΠΌ Π½ΡƒΠΆΠ΅Π½ отсортированный список Π±Π΅Π· ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π΅Π½ΠΈΠΉ элСмСнтов, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ TreeSet (для сохранСния порядка сортировки) ΠΈΠ»ΠΈ LinkedHashSet (для сохранСния порядка вставки). Π­Ρ‚ΠΈ классы автоматичСски Π±Π΅Ρ€ΡƒΡ‚ Π½Π° сСбя всС Π΄Π΅Ρ‚Π°Π»ΠΈ. Волько Π² ситуациях, ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π½Ρ‹Ρ… ΠΏΠΎ Π±Ρ‹ΡΡ‚Ρ€ΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΈΡŽ, эти классы Π·Π°ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ массивами с Ρ€ΡƒΡ‡Π½Ρ‹ΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ.

ΠŸΡ€ΠΈ сортировкС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Ρ… массивов с использованиСм Comparator (ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½Ρ‹Π΅ массивы Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ сортировку с Comparator) Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Comparator, Ρ‡Ρ‚ΠΎ ΠΈ ΠΏΡ€ΠΈ использовании binarySearch() (ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π½ΠΎΠΉ вСрсии). НапримСр, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ StringSorting.java ΠΌΠΎΠΆΠ½ΠΎ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ для выполнСния поиска:

//β€’ arrays/AlphabeticSearch.java // Поиск с Comparator, import java.util.*; import net.mindview.util.*;

public class AlphabeticSearch {

public static void main(String[] args) {

String[] sa = Generated.array(new String[30],

new RandomGenerator String(5)); Arrays.sort(sa. String.CASE_INSENSITIVE_ORDER); System.out.pri ntln(Arrays.toStri ng(sa)); int index = Arrays.binarySearch(sa. sa[10],

Stri ng. CASE JNSENSITI VE_0RDER); System.out.printlпБ'ИндСкс: "+ index + "\n"+ sa[index]);

}

} /* Output

[bklna. cQrGs. cXZJo. dLsmw. eGZMm. EqUCB. gwsqP. hKcxr, HLGEa. HqXum, HxxHv, JMRoE. JmzMs. Mesbt, MNvqe, nyGcF, ogoYW, OneOE. OWZnT. RFJQA. rUkZP. sgqia, slJrL, suEcU. uTpnX, vpfFv, WHkjU. xxEAJ, YNzbr, zDyCy] ИндСкс 10 HxxHv *///.-

ΠžΠ±ΡŠΠ΅ΠΊΡ‚ Comparator пСрСдаСтся ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π½ΠΎΠΌΡƒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ binarySearch() Π² Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π΅. Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ успСх поиска Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ искомоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ выбираСтся ΠΈΠ· самого массива.

РСзюмС

Π’ этой Π³Π»Π°Π²Π΅ Π²Ρ‹ ΡƒΠ±Π΅Π΄ΠΈΠ»ΠΈΡΡŒ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ язык Java прСдоставляСт Π½Π΅ΠΏΠ»ΠΎΡ…ΡƒΡŽ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹Ρ… массивов фиксированного Ρ€Π°Π·ΠΌΠ΅Ρ€Π°. Π’Π°ΠΊΠΈΠ΅ массивы ΠΎΡ‚Π΄Π°ΡŽΡ‚ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΏΠ΅Ρ€Π΅Π΄ Π³ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒΡŽ. Π’ исходной вСрсии Java Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹Π΅ массивы фиксированного Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π±Ρ‹Π»ΠΈ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ β€” Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΠΈ Java Ρ€Π΅ΡˆΠΈΠ»ΠΈ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π² язык ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ (Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎ сообраТСниям быстродСйствия), Π½ΠΎ ΠΈ ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² Π² этой вСрсии Π±Ρ‹Π»Π° ΠΊΡ€Π°ΠΉΠ½Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠΉ.