使用二分查找比较器从列表中搜索用户定义对象的 Java 程序


Java 比较器接口用于对 Java 对象进行排序。Java 中的比较器类通过调用“java.util.comparator”来比较不同的对象(对象 01、对象 02)。在此方法中,可以根据返回值比较对象。在比较中,它可以是正数、等于或负数。

此过程为用户提供了多种排序序列。有很多方法可以执行两种方法之间的比较。

  • public int compare class (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() 和比较器类操作,以使用二分查找操作通过比较器对一些用户定义的数据进行排序

示例 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 中的可比接口,并使用了一些示例代码和算法。在这里,我们声明了一些用户定义的类和比较器接口。它们具有一些特定用途,允许在 Java 环境中处理特定数据。

更新于: 2023-04-11

256 次查看

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告