2012-11-19 3 views
0

У меня есть раздел кода, который изменяет значение параметра на основе желаемого ввода и вывода, который был выбран. Итак, в приведенном ниже примере я вычисляю объем сферы, а затем в зависимости от единиц, которые пользователь использовал для ввода, и единиц, которые пользователь выбрал для вывода, с которым обрабатывается номер.Две, казалось бы, одинаковые строки не равны

Моя проблема в том, что все мои операторы if возвращают false, а число 10 (из другого) проходит независимо от того, что выбрано. Я напечатал значение inputPref и outputPref, и они выглядят в точности равными «мм» и «кубический см» (например) и все еще не будут зафиксированы операторами if.

Любые очевидные ошибки? Две переменные «inputPref» и «outputPref» загружаются из общих настроек, если это помогает!

double volumeBase = 4 * piDouble * radius * radius * radius/3; 

       double volume; 
       if(inputPref.equals("mm") || outputPref.equals("cubic cm")) 
       { 
        volume = volumeBase/1000; 
       } 
       if(inputPref.equals("mm") || outputPref.equals("cubic metres")) 
       { 
        volume = volumeBase/1000000000; 
       } 
       if(inputPref.equals("cm") || outputPref.equals("cubic mm")) 
       { 
        volume = volumeBase * 1000; 
       } 
       if(inputPref.equals("cm") || outputPref.equals("cubic metres")) 
       { 
        volume = volumeBase/1000000; 
       } 
       if(inputPref.equals("metres") || outputPref.equals("cubic mm")) 
       { 
        volume = volumeBase * 1000000000; 
       } 
       if(inputPref.equals("metres") || outputPref.equals("cubic cm")) 
       { 
        volume = volumeBase * 1000000; 
       } 
       else 
       { 
        volume = 10; 
       } 
+0

try inputPref.trim(). Equals() –

+0

Урезали ли вы ('String.trim()') строки? – SJuan76

+0

Кроме того, у меня такое чувство, что ваши '' '' или '' должны быть '&&' и. – SJuan76

ответ

6

Все ваши if заявления (кроме первого) должна быть else if заявления, так что он только выбирает 1 из всех вариантов.

Как можно заметить, что ваш код может быть вычисляя if заявление на ранней стадии, но она становится перезаписаны последней if-else в самом конце, который почти всегда собирается вернуться 10.

Как было отмечено в комментариях, вы, вероятно, также смысл использовать && вместо || так, что вы используете код, когда оба условия матча в каждом if или else if заявление. Вы также можете использовать equalsIgnoreCase() вместо equals(), так что случай ввода данных не имеет значения.

Это должно быть ...

double volumeBase = 4 * piDouble * radius * radius * radius/3; 

double volume; 
if(inputPref.equalsIgnoreCase("mm") && outputPref.equalsIgnoreCase("cubic cm")){ 
    volume = volumeBase/1000; 
} 
else if(inputPref.equalsIgnoreCase("mm") && outputPref.equalsIgnoreCase("cubic metres")){ 
    volume = volumeBase/1000000000; 
} 
else if(inputPref.equalsIgnoreCase("cm") && outputPref.equalsIgnoreCase("cubic mm")){ 
    volume = volumeBase * 1000; 
} 
else if(inputPref.equalsIgnoreCase("cm") && outputPref.equalsIgnoreCase("cubic metres")){ 
    volume = volumeBase/1000000; 
} 
else if(inputPref.equalsIgnoreCase("metres") && outputPref.equalsIgnoreCase("cubic mm")){ 
    volume = volumeBase * 1000000000; 
} 
else if(inputPref.equalsIgnoreCase("metres") && outputPref.equalsIgnoreCase("cubic cm")){ 
    volume = volumeBase * 1000000; 
} 
else { 
    volume = 10; 
} 

Если он все еще не работает, это может быть проблема с кодом, где вы читаете, введенные пользователем.

+0

Спасибо @ SJuan76 хорошо замечаю - я думаю, вы, вероятно, правы, исходя из его требований. Ответ обновляется как таковой. – wattostudios

6

else вашего Windows в конце будет установить громкость на 10 если inputPref не metres или cubic cm, потому что только ваша последнейif связана с этой else. Если вы поместите else перед каждым из предыдущих if, он может работать больше, как вы ожидаете. У вас также есть несколько дубликатов (вы проверяете mm более одного раза).

E.g. (Смотри также ниже):

double volume; 
if(inputPref.equals("mm") || outputPref.equals("cubic cm")) 
{ 
    volume = volumeBase/1000; 
} 
// v--- Note the `else` 
else if(inputPref.equals("mm") || outputPref.equals("cubic metres")) 
{ 
    volume = volumeBase/1000000000; 
} 
// ... 

Кроме того, как noted by Lews Therin, я подозреваю, что вы хотите && для каждой пары из тех, например,:

// here -------------------vv 
if (inputPref.equals("mm") && outputPref.equals("cubic cm")) 

не

if (inputPref.equals("mm") || outputPref.equals("cubic cm")) 
+2

Обратите внимание, что String-переключатель работает только с Java7! – ppeterka

+0

@ppeterka: И все же это недействительно для этого случая использования (только что удалило его), я пропустил, что проверяются две разные переменные. :) –

5

Я думаю, что вы хотите использовать else if «S и ваши условия использования & & не ||

+1

Mmn .. не уверен, почему я получаю downvoted. Я думаю, что имеет смысл, если условия используют &&, а не || –

+0

Очень хороший улов на '&&' vs. '||'. –

1

, вероятно, ваш последний если является неудачу, таким образом объем назначается в еще, Примечание: еще будет применяться только для последнего, если. использование еще-если вместо всех

if(cond){ 

} 
else if(cond){ 

} 
else{ 

} 
1

Я бы выбросить Струны и использовали перечислений для такого кода ...

public enum LengthUnit { 
    M, 
    CM, 
    MM 
} 

public enum VolumeUnit { 
    M3, 
    CM3, 
    MM3 
} 

Можно даже поставить коэффициенты конверсии КРП в в там среди аналогичных подразделений, как в TimeUnit

Pros:

  • нет тумана ypes, нет тайны
  • быстрее

Против:

  • требует некоторых усилий для поддержания, если она должна быть расширена.
Смежные вопросы