2014-01-14 3 views
1

Я программирую симуляцию радио тюнера. Теперь я хочу иметь метод, который может проходить через массив или arraylist, с шагом 0,05 МГц. На данный момент у меня есть массив с моими любимыми радиочастотами, и цикл должен быть остановлен, если найдена частота.Найти следующее двойное значение в массиве

public static double favFrequencies [] = {89.8, 91.5, 93.7, 95.1, 97.7, 99.2, 100.7, 101.2, 101.7, 102.7, 103.0, 104.4}; 

На данный момент у меня есть следующий код:

public static void searchDown() 
{ 
    double startFrequency = Math.round(currentFreq * 100); 
    double maxFrequency = Math.round(87.80 * 100); 
    for (double f = startFrequency; f > maxFrequency; f -= 5) { 
     //boolean nextFavFound = false; 
     if (f < 8785) 
     { 
      f = 10800; 
     } 
     for (double f2 : favFrequencies) { 
      if (f/100 == f2) { 
       nextFavFound = true; 
       //break; 
      } 
     } 
     if (nextFavFound) { 
      currentFreq = f /100; 
      RadioGUI.lblFreq.setText("FM " + Double.toString(currentFreq)+ "Mhz"); 
      System.out.println("next favFrequency: " + f/100); 
      nextFavFound = false; 
      break; 
     } 
    } 
} 

Это действительно работает очень хорошо, но когда я снова запустить метод, он не будет работать с новым, выводимого значения в первый раз ,

+0

Я использую [For Loop] (http://docs.oracle.com/javase/tutorial/java/nutsandbolts/for.html) сравнивает частоту против моих и если я найду его, то перерыв из заявления. [ЗДЕСЬ] (http://docs.oracle.com/javase/tutorial/java/nutsandbolts/branch.html) является хорошим примером этого. – gtgaxiola

+0

Я обновил вопрос –

ответ

1

Нарвешься в точности проблемы при использовании for -loops и в double приращение с знаков после запятой. Один прагматический подход к вашей проблеме будет умножаться на коэффициент 100.

public static void main(String[] args) { 
    double startFrequency = Math.round(88 * 100); 
    double maxFrequency = Math.round(108 * 100); 
    for (double f = startFrequency; f < maxFrequency; f += 5) { 
     boolean nextFavFound = false; 
     for (double f2 : favFrequencies) { 
      if (f/100 == f2) { 
       nextFavFound = true; 
       break; 
      } 
     } 
     if (nextFavFound) { 
      System.out.println("next favFrequency: " + f/100); 
     } 
    } 
} 
+0

Я немного добавил ваш код, и теперь он возвращает следующую favFrequency, которая найдена после текущей частоты. Когда я снова запускаю метод, он снова и снова возвращает одно и то же значение. –

0

Начните с простого for loop, инициируйте i на любой минимальной частоте, остановитесь на максимальной частоте и приращении на 0,05 (убедитесь, что i является двойным). Затем, вы можете проверить на каждом шаге:

boolean containsFav = false; 
for(double i=80.00;i<110.00;i=i+0.05){ 
    if(Arrays.asList(favFrequencies).contains(i)){ 
     containsFav = true; 
     break; 
    } 
} 
+0

Вы действительно позволили этому запустить? Он проходит весь путь через 110 и никогда не находит любимую частоту. На моей машине, по крайней мере. – zb226

+1

ugh, это связано с точностью. Держись ... –

+0

У меня такой же результат. В моем случае все петли все в порядке и ничего не нашли. Оператор My if выглядит следующим образом: if (Arrays.asList (favFrequencies) .contains (Math.round (i * 20.0)/20.0)) –

0

Со следующим кодом я исправил свою проблему.

public static void searchUp() 
{ 
    currentFreq +=0.05; 
    double startFrequency = Math.round(currentFreq * 100); 
    double maxFrequency = Math.round(108 * 100); 
    for (double f = startFrequency; f < maxFrequency; f += 5) { 
     //boolean nextFavFound = false; 
     if (f > 10790) 
     { 
      f = 8780; 
     } 
     for (double f2 : favFrequencies) { 
      if (f/100 == f2) { 
       nextFavFound = true; 
       //break; 
      } 
     } 
     if (nextFavFound) { 
      currentFreq = f /100; 
      RadioGUI.lblFreq.setText("FM " + Double.toString(currentFreq)+ "Mhz"); 
      //System.out.println("next favFrequency: " + f/100); 
      nextFavFound = false; 
      //currentFreq +=0.05; 
      break; 
     } 
    } 
} 
Смежные вопросы