如何使用二进制搜索获取更多搜索数据?

时间:2014-06-19 16:37:27

标签: java arrays search indexing

首先,我为我的英语道歉,这是我第一次询问stackoverflow,所以如果我错过了什么,请指出。

所以我是java的新手,在朋友的帮助下尝试二元搜索。代码是在使用产品ID搜索后显示产品信息。我设法让它返回找到Id的索引号,但问题是当我输入多个相同的ID时它只显示1个数据。我希望我的程序显示找到ID-12的所有索引。

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class MyListBinarySearch {

public static void main(String a[]){

    List<Emp> empList = new ArrayList<Emp>();
    empList.add(new Emp(12,"Apple,50,10-5-2014"));
    empList.add(new Emp(12,"Apple,50,5-5-2014"));
    empList.add(new Emp(124,"Apple,50,2-5-2014"));
    empList.add(new Emp(302,"Apple,50,2-5-2014"));
    empList.add(new Emp(12,"Apple,50,2-5-2014"));

    Emp searchKey = new Emp(12,"String");
    int index = Collections.binarySearch(empList, searchKey, new EmpComp());
    System.out.println("Index of the searched key: "+index);
}
}

class EmpComp implements Comparator<Emp>{

public int compare(Emp e1, Emp e2) {
    if(e1.getEmpId() == e2.getEmpId()){
        return 0;
    } else {
        return -1;
    }
}
}

class Emp {

private int empId;
private String empInfo;


public Emp(int id, String info){
    this.empId = id;
    this.empInfo = info;

}

public int getEmpId() {
    return empId;
}

public void setEmpId(int empId) {
    this.empId = empId;
}

public String getEmpInfo() {
    return empInfo;
}

public void setEmpInfo(String empInfo) {
    this.empInfo = empInfo;
}

@Override
public String toString(){
    return empId+" : "+empInfo;
}
}

out是“搜索键索引:2” 我想显示找到搜索关键字的所有索引。 我怎么做 ?我需要循环吗?

2 个答案:

答案 0 :(得分:1)

你有两个问题:

  1. 当当前元素大于比较元素时,比较器应返回大于0的值,当元素等于时,应返回0,当当前元素小于比较元素时,小于0。您当前的实施并未涵盖此内容。
  2. 二进制搜索仅适用于已排序的数组/列表。您的列表未按ID排序。
  3. 修复此问题后,您将有效地使用二进制搜索。检索元素为12的索引后,您可以搜索元素以检索具有相同Id的所有元素。

    这是一个如何实现它的想法:

    int index = Collections.binarySearch(empList, searchKey, new EmpComp());
    List<Emp> empsWithId12 = new ArrayList<Emp>();
    for (int i = index - 1; i >= 0; i--) {
        Emp emp = empList.get(i);
        if (emp.getId() == 12) {
            empsWithId12.add(emp);
        } else {
            break;
        }
    }
    Collections.reverse(empsWithId12);
    for (int i = index; i < empList.size(); i++) {
        Emp emp = empList.get(i);
        if (emp.getId() == 12) {
            empsWithId12.add(emp);
        } else {
            break;
        }
    }
    

    请注意,通过将逻辑移动到方法中,可以大大改善上述想法。

答案 1 :(得分:0)

获得搜索关键字的索引后,您可以向后或向左移动列表以查找键等于搜索关键字的所有其他索引