2012-11-17 167 views
1

對不起,如果我的問題看起來很愚蠢。我在.compareTo()上遇到錯誤無法在基本類型double上調用compareTo(double)!我怎樣才能解決這個問題 ?謝謝!原始類型雙錯誤

車輛類:

public class Vehicle implements IOutput { 
private double cost;} 

public double getCost(){ 
     return cost; 
    } 

Array類:

public static void sortByVehicleMakeModel(Vehicle[] vehicles) { 

    boolean swapped = true; 

    for(int y = 0; y < vehicles.length && swapped; y++) { 
     swapped=false; 
     for(int x = 0; x < vehicles.length - (y+1); x++) { 
      if(vehicles[x].getCost().compareTo(vehicles[x + 1].getCost()) > 0){ 
       swap(vehicles, x, x + 1); 
       swapped=true; 
      } 
     } 
    } 
} 

我的其他代碼工作正常:

public static void sortByOwnerName(Vehicle[] vehicles) { 
    boolean swapped = true; 

    for(int y = 0; y < vehicles.length && swapped; y++) { 
     swapped=false; 
     for(int x = 0; x < vehicles.length - (y + 1); x++) { 
      if(vehicles[x].getOwner().getName().compareTo(vehicles[x + 1].getOwner().getName())> 0) { 
       swap(vehicles, x, x + 1); 
       swapped=true; 
      } 
     } 
    } 
} 
+1

沒有'getCost()'返回'double'或'Double'?從錯誤信息中,我認爲'Double'和問題是缺少'> 0'。但讓我們仔細檢查! –

+0

@AndrewLazarus:錯誤消息說 - 「...不能在原始類型double **上調用compareTo(double)**」。 –

+0

愚蠢的問題,和題外話,但你爲什麼做泡沫排序? –

回答

3

變化從doubleDoublegetCost()方法的返回類型,它都窩ķ。自動拳擊將照顧其餘。

+0

這不會工作,因爲沒有比較運算符(==,>,<)!它不是C++的隱式 –

+1

@AndrewLazarus:請仔細閱讀答案,然後再粗心大意地回過頭看看 –

+0

@BheshGurung好吧,你們所有人都錯過了真正的錯誤,所以你會陷入低估。事實是,我不這麼做經常,但是這太過分了,如果getCost()返回一個'double',正確的解決方案就是不對雙方進行裝箱(操作非常慢),但是使用一個香草比較聲明。 –

1

if(vehicles[x].getCost().compareTo(vehicles[x + 1].getCost()))

你需要>0在那裏!

+0

if(vehicles [x] .getCost()。compareTo(vehicles [x + 1] .getCost())> 0){does not work and same error !! – NilR

+1

在這種情況下,您有兩個錯誤。如果getCost返回一個'double'(小d),則不要使用compareTo。只要使用普通的'if(a.getCost()> b.getCost())'如果它返回一個'Double',compareTo應該可以工作,並且你有一個錯誤的地方。 [如果你願意,你可以在getCost()方法上使用'Double',它會返回一個'double',但這是非常低效的。] –

+1

哇,安德魯,我從你身上學到了很多謝謝! :D ...&我沒有這樣想過,d或D可以產生很大的差異;) – NilR

0

您只能調用引用類型的方法,double是原始類型。由於錯誤消息暗示vehicles[x].getCost()返回double

一兩件事你可以做的是手工打你doubleDouble

int costComp = Double.valueOf(vehicles[x].getCost()).compareTo(Double.valueOf(vehicles[x + 1].getCost()); 

if(costComp < 0) { 
    //... 
} else if(costComp == 0) { 
    //... 
} else { 
    //... 
} 
+0

這不會工作,因爲沒有比較運算符(==,> =,<=)!它不是C++,對0進行隱式測試。 –

+0

如果它在if語句中,它將不起作用。 –

+0

@AndrewLazarus:我不知道你說什麼不行, –

1

compareTo方法不適用於premitive類型。使用Wrapper Double爲:

 if(Double.valueOf(vehicles[x].getCost()) 
      .compareTo(Double.valueOf(vehicles[x + 1].getCost()))>0){ 

請注意:Double.valueOf(double)將返回值double包裝類型Double

請注意:如果你的目標是利用compareTo那麼它的罰款,否則,你可能想直接比較使用比較操作<, >, ==適當double值。

+0

這不會工作,因爲沒有比較運算符(==,> =,<=)!它不是C++與0隱式測試。 –

+0

我試過但說:類型不匹配:不能從int轉換爲布爾值 – NilR

+0

看看有效的行。你看它是如何測試'> 0'的?現在看看失敗的那一行。沒有測試。並且不要針對'true'或'false'進行測試; compareTo返回一個int。與0-進行比較。 –

0

你們的這個代碼工作正常

if(vehicles[x].getOwner().getName().compareTo(vehicles[x+1].getOwner().getName())> 0)

vehicles[x+1].getOwner().getName()因爲必須返回StringcompareTo方法的對象接受一個對象作爲參數。

此代碼不能正常工作

if(vehicles[x].getCost().compareTo(vehicles[x + 1].getCost()))

因爲vehicles[x + 1].getCost()不能返回一個對象(在你的情況下,必須返回一個原始double),所以有不匹配的類型和編譯器抱怨有沒有這樣的compareTo方法接受double(基本)

+0

它是一個對象! – NilR

+1

@Niloo是你的車輛[x + 1] .getCost()'返回一個類型爲'Double'的對象? – Abubakkar

0

我把它改爲:中

public Double getCost() 

代替

public double getCost(){ 
return cost; 
} 
+0

它是如此愚蠢!但不明白爲什麼? – NilR

+1

因爲小雙d **不是一個對象,所以你不能調用它的方法。如果可以的話,你可以編寫'4.3.compareTo(-11.8);'所以你確實有兩個錯誤,一個關於使用框,一個關於比較零。就個人而言,我會恢復使用compareTo返回double和_not_;你會以這種方式招致不必要的開銷。 –

+0

@安德魯謝謝你,但這是我的教授要求的。對不起,但我學到了很多:) – NilR