Java 使用二进制搜索比较器从列表中搜索用户定义的对象
Java比较器接口用于对Java对象进行排序。在Java中,比较器类通过调用”java.util.comparator”来比较不同的对象(Obj 01,Obj 02)。在该方法中,可以根据返回值进行比较。比较的结果可以是正数、零或负数。
该过程为用户提供了多个排序序列。有许多方法可以在两个方法之间进行比较。
- public int compareClass(obj 1, obj 2) – 在两个对象之间进行比较。
-
public Boolean equals(obj) – 将当前对象与指定对象进行比较。
Java集合类 – 提供了从数据集合中对元素进行排序的静态方法。在这里,集合元素用于TreeMap。
让我们讨论如何使用比较器构建一个Java代码,通过使用二进制搜索从列表中搜索用户定义的对象。
二进制搜索参数及其组成部分
- 参数
- 是一个特定的数组
-
fromindex – 要搜索的第一个元素
-
toindex – 要搜索的最后一个元素
-
key – 要搜索的值
-
比较器
-
返回值
- 返回在指定范围内存在的搜索键的索引。
- 异常
- ClassCast
- IllegalArgument
- ArrayIndexOutOfBounds
步骤
- 步骤1 – 开始。
-
步骤2 – 计算中间元素集合。
-
步骤3 – 将键与中间元素进行比较。
-
步骤4 – 如果键的值和中间元素的值相同,则返回结果。
-
步骤5 – 否则,如果键的值大于中间元素,则跟随右半部分集合。
-
步骤6 – 或者,如果键的值小于中间元素,则跟随上部分。
使用比较器的二进制搜索 – 语法
public static int binarySearch(primitive() p,Primitive key)
public static int binarySearch(Object() o,Object key)
public static int binarySearch(Object() o,Object key,Comparator c)
Java Collections binarySearch(List<? extends Comparable1<? super R>> list, R key)and;
Java Collections binarySearch(List<? extends R> list, R key, Comparator<? super R> c)
有两种众所周知的语法用于通过使用比较器的二分查找来搜索用户定义的对象列表。对于第一种情况,列表需要按升序排序,调用特定方法的过程中的结果是未定义的。
另一方面,要搜索指定的对象,调用方法是很重要的。
遵循的方法
- 方法1 − 使用比较器的二分查找从列表中搜索用户定义的对象
使用比较器从列表中搜索用户定义的对象
在这些示例中,我们使用集合、binarySearch()和comparator类操作来通过比较器使用二分查找操作排序一些用户定义的数据
示例1:使用Collections、binarySearch()从列表中查找数据
import java.util.*;
public class Binarysearch {
public static void main(String[] args){
List<Domain> l1 = new ArrayList<Domain>();
l1.add(new Domain(100, "India"));
l1.add(new Domain(200, "Bangladesh"));
l1.add(new Domain(300, "Dhaka"));
l1.add(new Domain(400, "Kolkata"));
Comparator<Domain> c = new Comparator<Domain>() {
public int compare(Domain u1, Domain u2) {
return u1.getId().compareTo(u2.getId());
}
};
int index = Collections.binarySearch( l1, new Domain(10, null), c);
System.out.println("Found at index number zone" + index);
index = Collections.binarySearch(l1, new Domain(6, null), c);
System.out.println(index);
}
}
class Domain {
private int id;
private String url;
public Domain(int id, String url){
this.id = id;
this.url = url;
}
public Integer getId() { return Integer.valueOf(id); }
}
输出
Found at index number zone-1
-1
示例2:按升序排序列表
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class ascendingsearch {
public static void main(String[] args){
List<Integer> ak = new ArrayList();
ak.add(100);
ak.add(200);
ak.add(30);
ak.add(10);
ak.add(20);
int index = Collections.binarySearch(ak, 100);
System.out.println(index);
index = Collections.binarySearch(ak, 130);
System.out.println(index);
}
}
输出
Note: ascendingsearch.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
-6
-6
示例3:降序排序列表并找到索引号
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class binsearchdecend {
public static void main(String[] args){
List<Integer> a0710 = new ArrayList<Integer>();
a0710.add(1000);
a0710.add(500);
a0710.add(300);
a0710.add(10);
a0710.add(2);
int index = Collections.binarySearch(
a0710, 50, Collections.reverseOrder());
System.out.println("Found at index number present " + index);
}
}
输出
Found at index number present -4
示例4:查找元素和值的数量
import java.util.Scanner;
public class BinarySearchExample{
public static void main(String args[]){
int counter, num, item, array[], first, last, middle;
Scanner input = new Scanner(System.in);
System.out.println("Enter number of elements:");
num = input.nextInt();
array = new int[num];
System.out.println("Enter " + num + " integers");
for (counter = 0; counter < num; counter++)
array[counter] = input.nextInt();
System.out.println("Enter the search value:");
item = input.nextInt();
first = 0;
last = num - 1;
middle = (first + last)/2;
while( first <= last ){
if ( array[middle] < item )
first = middle + 1;
else if ( array[middle] == item ){
System.out.println(item + " found at location " + (middle + 1) + ".");
break;
}
else{
last = middle - 1;
}
middle = (first + last)/2;
}
if ( first > last )
System.out.println(item + " is not found.\n");
}
}
输出
Enter number of elements:
7
Enter 7 integers
10
12
56
42
48
99
100
Enter the search value:
50
50 is not found.
结论
在本文中,我们通过一些示例代码和算法学习了Java中的Comparable接口。在这里,我们声明了一些自定义的类和比较器接口。它们具有特定的用途,允许在Java环境中处理特定的数据。