如何使用二进制搜索来查找具有一定权重的数组中的第一个元素(另一个元素在不同的数组中)?

时间:2012-02-13 03:16:01

标签: java arrays binary-search

这里的所有方法都是正确的,但我的问题是我必须在零件数组中找到具有一定重量的零件。所以在我做了getweight方法后,我想我必须调用它。但代码的最后一部分是我遇到的问题。它从行公共部分getPartWithWeight(int weight){

开始
class Robot {
             Part[] parts;
                 public Robot () {// assume these are right}
                 }
                 public void addPart(Part p) { // assume these are right}
                 }

             class Part {
             // Class details not shown
                 public double getWeight() {//... }
                 }
                 public int getPartnum() {//...}
                 }
                 public String getMaterial() {//...}     
                 }

             public Part getPartWithWeight (int weight){
             for(int i = 0; i < parts.length; i ++){
                 if (parts[i].weight == weight) {
                     return parts[i];
                 }
                 }

3 个答案:

答案 0 :(得分:1)

嗯,这是“开箱即用”的版本。

第1步写一个比较器。

class PartComparator implements java.util.Comparator<Part> {
    @Override
    public int compare(Part part1, Part part2) {
        return part1.weight - part2.weight;
    }
    public final static PartComparator instance = new PartComparator();
}

如果你在Part中声明它,那么比较器类应该是静态的(这是我建议的)。

第2步使用比较器

public Part getPartWithWeight (int weight){
    Part pivot = new Part();
    pivot.weight = weight;
    int idx = Arrays.binarySearch(parts, pivot, PartComparator.instance);
    return parts[idx];
}

答案 1 :(得分:0)

if (parts[i].weight == weight)

应该说

if (parts[i].getWeight() == weight)

您应该使用 getWeight(),因为这是在Parts类中定义的方法。 此外,如果您遇到的问题是从机器人类获取零件数组并在零件类中使用它,那么您应该将其作为参数传递。

public Part getPartWithWeight (int weight, Part[] parts){
  for(int i = 0; i < parts.length; i ++){
    if (parts[i].getWeight() == weight) {
      return parts[i];
    }
  }
}

然后当你调用方法getPartWithWeight()时,确保你也把数组放在那里。

编辑:同样根据Ray Cheng的评论,你正在寻找的权重应该是一个int,但你的getWeight()方法返回一个double ....所以你的getWeight()应该返回in或者你应该在进行比较之前将其作为int进行类型转换。请注意,如果将其类型化为int,则会失去一些精度。最好修复你的getWeight(),这样它就会像你需要的那样返回一个双精度。

答案 2 :(得分:0)

要实现二进制搜索,首先需要将数组减半,然后决定要开始搜索的那一半。然后你再将一半的阵列切成两半并重复......

除非您想要实现自己的,但看起来有一个内置的,你可以打电话。

http://docs.oracle.com/javase/7/docs/api/index.html?java/util/Arrays.html