2012-11-17 11 views
1

извините, если мой вопрос выглядит очень глупо. Я получаю сообщение об ошибке .compareTo() Не удается вызвать compareTo (double) в двойном примитиве типа double! Как я могу это исправить ? Спасибо! Класспримитивный тип двойной ошибки

Автомобиль:

public class Vehicle implements IOutput { 
private double cost;} 

public double getCost(){ 
     return cost; 
    } 

Массив Класс:

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'? Из сообщения об ошибке, я думаю, «Двойной», и проблема заключается в отсутствии «> 0». Но давайте дважды проверь! –

+0

@AndrewLazarus: В сообщении об ошибке говорится: «... Невозможно вызвать compareTo (double) ** для примитивного типа double **». –

+0

Глупый вопрос, и вне темы, но почему вы делаете пузырь? –

ответ

3

Изменить тип возврата вашего метода getCost() от double к Double, и это будет все приста к. Авто бокс позаботится обо всем остальном.

+0

Это НЕ будет работать, потому что нет оператора сравнения (==,>, <)! Это не C++ с неявным тест против 0. –

+1

@AndrewLazarus: Пожалуйста, внимательно прочитайте ответ, прежде чем обойтись без разбора. –

+0

@BheshGurung Ну, вы все пропустили настоящую ошибку, так что вы опустили вниз. Правда, я этого не делаю часто, но это было вопиюще. Если getCost() возвращает «double», правильное решение не боксирует обе стороны (чрезвычайно медленная операция), но с использованием ванильного сравнения заявление. –

1

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

Вам нужно >0 где-то там!

+0

если (транспортные средства [x] .getCost(). CompareTo (транспортные средства [x + 1] .getCost())> 0) {не работает и такая же ошибка !! – NilR

+1

В этом случае у вас есть две ошибки. Если getCost возвращает 'double' (small d), не используйте compareTo. Просто используйте простой старый 'if (a.getCost()> b.getCost())' Если он возвращает 'Double', compareTo должен работать, и у вас есть опечатка где-то. [Если вы хотите, вы можете использовать материал 'Double' на' getCost() ', который возвращает' double', но это _very_ неэффективно.] –

+1

wow Andrew, я многому научился от вас Спасибо! : D ... и у меня не было ни одной идеи, что d или D могут иметь большое значение;) – NilR

0

Вы можете использовать методы только для ссылочного типа, double - примитивный тип. Как следует из сообщения об ошибке, vehicles[x].getCost() возвращает double.

Одна вещь, вы можете сделать это вручную боксировать ваш double в Double:

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) возвращает тип Wrapper Double со значением как double.

Пожалуйста, обратите внимание: Если ваша цель состоит в том, чтобы использовать compareTo то его штраф в противном случае, вы можете непосредственно сравнить double значения, используя операторы сравнения <, >, == в зависимости от обстоятельств.

+0

Это НЕ работает, потому что нет оператора сравнения (==,> =, <=)! Это не C++ с неявным тестом против 0. –

+0

Я пробовал, но сказал: Тип несоответствия: невозможно преобразовать из int в boolean – NilR

+0

Посмотрите на строку, которая работает. Вы видите, как у него есть тест '> 0'? Теперь посмотрим на линию, которая терпит неудачу. Нет теста. И не проверяйте «истина» или «ложь»; compareTo возвращает int. Сравните с 0-. –

0

Этот код прекрасно работает ваша

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

потому vehicles[x+1].getOwner().getName() должен возвращаться объект String и compareTo метод принимает объект в качестве аргумента.

Этот код не работает

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

потому vehicles[x + 1].getCost() не должен возвращаться объект (в вашем случае оно должно быть возвращением примитивной double), поэтому существует несоответствие типа и компилятор жалуется что не существует такой compareTo метод, который принимает double (примитивный)

+0

это объект! – NilR

+1

@Niloo - ваш 'vehicle [x + 1] .getCost()' возвращает объект типа 'Double'? – Abubakkar

0

Я изменил это:

public Double getCost() 

вместо

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

было так глупо !!! но не понимаю почему? !!! – NilR

+1

Потому что little-d double ** не является объектом, ** поэтому вы не можете вызывать методы на нем. Если бы вы могли, вы могли бы написать '4.3.compareTo (-11.8):' Итак, у вас были две ошибки, одна из которых касается использования ящиков, а другая - для сравнения с нулем. Лично я вернусь к возврату double и _not_, используя compareTo; таким образом, вы несете ненужные накладные расходы. –

+0

@ Андрей, спасибо, но это потребовал мой профессор. Извините за неприятности, но я многому научился :) – NilR

Смежные вопросы