簡體   English   中英

如何使用二進制搜索來查找具有一定權重的數組中的第一個元素(另一個數組中的另一個元素)?

[英]How to use binary search in order to find the first element in an array that has certain weight (another element in a different array)?

這里的所有方法都是正確的,但是我的問題是我必須在零件陣列中找到具有一定權重的零件。 所以,在我執行getweight方法之后,我想我必須調用它。 但是代碼的最后一部分是我遇到的問題。 它從以下行開始:Public Part 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];
                 }
                 }

好吧,這是“即開即用”的版本。

步驟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];
}
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的評論,您正在尋找的權重應該是一個整數,但是您的getWeight()方法返回一個double ....,因此您的getWeight()應該返回in或您應該將其鍵入為進行比較之前的int值。 請注意,如果將其作為int進行轉換,則將失去一些精度。 最好修復getWeight(),以便它返回所需的double值。

要實現二進制搜索,您首先需要將數組切成兩半,然后確定要開始搜索的是哪一半。 然后您將切成兩半的數組再切成兩半,然后重復...

除非您想實現自己的實現,但是看起來好像有一個內置的可以調用。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM