![](/img/trans.png)
[英]How do you find the first element in array that has a certain characteristic?
[英]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.