2013-03-20 5 views
-5

Как мне заставить эту программу остановиться и вернуться, чтобы включить и выключить телевизор?Boolean to String в Java

Если выбрано ВЫКЛ, я хочу, чтобы он отображал текущий статус телевизора.

import java.util.Scanner; 

public class TvTest 
{ 
    public static void main (String[] args) 
    { 
     String x; 
     String y; 
     boolean tvStatus = false; 
     int chan; 
     int volu; 

     Scanner input = new Scanner(System.in); 
     TV tv2 = new TV(false,2,10); 

     // Print out the current status of our TV 
     System.out.print(tv2); 
     System.out.println(); 

      System.out.print("Turn TV On or Off ?"); 
      x = input.nextLine(); 

      if(x.equalsIgnoreCase("on")) 
       { 
        tvStatus = true; 

       }else if(x.equalsIgnoreCase("off")) 
       { 
        tvStatus =false; 
       } 

      System.out.print("Change the Channel to : "); 
      chan = input.nextInt(); 

      System.out.print("Increase the volume by 1 or Decrease by -1 : "); 
      volu = input.nextInt(); 

      TV tv1 = new TV(tvStatus,chan,volu); 

      if(volu == 1) 
      { 
       tv1.incrementVolume(); 

      }else if (volu == -1) 
      { 
       tv1.decrementVolume(); 
      } 

      System.out.println(tv1); 


    } 
}// ENd of TvTest 

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

public class TV 
{ 
    private boolean flag = false; 
    private int ch; 
    private int vol = 10; 

    public TV(boolean onOffSwitch, int channel, int volume) 
    { 
     this.setFlag(onOffSwitch); 
     this.setCh(channel); 
     this.setVol(volume); 
    } 

    public void setFlag(boolean onOffSwitch) 
    { 
     if(onOffSwitch == true) 
     { 
      flag = true; 
     }else 
     { 
      flag = false; 
     } 

    }// End of setFlag 

    public boolean getFlag() 
    { 
     return flag; 
    }// End of getFlag 

    public void setCh (int newChannel) 
    { 
     if (newChannel >= 99) 
     { 
      ch = 99; 
     }else 
     { 
      ch = newChannel; 
     } 

     if(newChannel < 0) 
     { 
      ch = 1; 
     } 
    }//end of setCh 

    public int getCh() 
    { 
     return ch; 
    }// End of getCh 

    public void setVol(int newVolume) 
    { 
     if(newVolume >= 20) 
     { 
      vol = 20; 
     } 

    }// End of SetVolume 

    public void incrementVolume() 
    { 
     vol++; 
    } 

    public void decrementVolume() 
    { 
     vol--; 
    } 

    public int getVol() 
    { 
     return vol; 
    }// ENd of getVolume 

    public String toString() 
    { 
     if(flag == false) 
     { 
      return String.format("%s :%s\n%s:%d\n%s :%d","TV is switched","OFF","TV channel",ch,"TV volume",vol); 
     }else 
     { 
      return String.format("%s :%s\n%s:%d\n%s :%d","TV is switched","ON","TV channel",ch,"TV volume",vol); 
     } 

    } 

}// End of TV class 
+2

Почему вас не устраивает тостри ng ?? – PermGenError

+0

Исправлен метод setFlag ... Что не так с вашим методом toString? Это слишком медленно? Разве он не пишет то, что вы ожидали? – LaGrandMere

+1

Я не понимаю, в чем именно заключается ваш вопрос. –

ответ

3

Во-первых, это один:

public void setFlag(boolean onOffSwitch) 
    { 
     if(onOffSwitch == true) 
     { 
      flag = true; 
     }else 
     { 
      flag = false; 
     } 

    } 

Должно быть:

public void setFlag(boolean onOffSwitch) 
    { 
     flag = onOffSwitch; 
    } 

Тогда:

public void setCh (int newChannel) 
    { 
     if (newChannel >= 99) 
     { 
      ch = 99; 
     }else 
     { 
      ch = newChannel; 
     } 

     if(newChannel < 0) 
     { 
      ch = 1; 
     } 
    }//end of setCh 

Должно быть:

ch = (newChannel>=99) ? 99 : ((newChannel<0) ? 1 : newChannel); 
+2

Избегайте использования тернарного состояния, подобного этому. Это плохой код, потому что ужасно понимать и страшно тестировать/отлаживать. Также нет возможности входа в систему. Лучший подход - вернуть новый канал 'public int getFilteredChannel (int channel)' и использовать 'if (channel> = 99) return 99;', 'if (channel <0) return 1;' и 'return channel'. Это гораздо легче читать и понимать в отличие от вашего подхода вложенных тернарных условий. Размер кода имеет значение, но не соответствует читабельности. – Eich

+0

@da_re это действительно более читаемый вариант. – LaGrandMere

2
public void setFlag(boolean onOffSwitch) 
    { 
     if(onOffSwitch == true) 
     { 
      flag = true; 
     }else 
     { 
      flag = false; 
     } 

    }// End of setFlag 

может быть ...

public void setFlag(final boolean onOffSwitch) 
     { 
      flag = onOffSwitch; 

     }// End of setFlag 

Во-вторых, у вас есть такая же проблема с ...

if(x.equalsIgnoreCase("on")) 
       { 
        tvStatus = true; 

       }else if(x.equalsIgnoreCase("off")) 
       { 
        tvStatus =false; 
       } 

может быть ...

tvStatus = x.equalsIgnoreCase("on"); 

Сделайте ваши параметры метода final в качестве общей практики refrenced в чистом коде Боб Мартин.

if (newChannel >= 99) 
     { 
      ch = 99; 
     }else 
     { 
      ch = newChannel; 
     } 

Может быть ...

ch = (newChannel>=99) ? 99 : newChannel; 

Наконец ...

if(flag == false) 

бы быть чище, чтобы просто сделать ...

if(!flag) 
+0

На самом деле, для tvStatus это не 'if ... else', а' if ... else if' ... поэтому в исходном коде, если это не 'on' или' off', это написано, ничего не происходит ... Поэтому я не уверен, что вы предложили правильно. – LaGrandMere

+0

Это либо включено, либо выключено в соответствии с кодом, который он опубликовал, поэтому вы можете просто использовать другое. По крайней мере, по мере того, как код, который он опубликовал, может быть реорганизован таким образом, если у него нет другого значения, кроме «on» или «off». – david99world

+0

Это зависит от того, что он хочет сделать ... Он сканирует System.in. В настоящее время он ошибается, он решает ничего не делать, ни включить телевизор, ни выключить его. Это может быть подходящий выбор. – LaGrandMere

1

Маленькая модификация ToString(). Пожалуйста, найдите ниже фрагменты кода:

if(flag == false) 
    { 
     return String.format("%s :%s\n%s:%d\n%s :%d","TV is switched","OFF","TV channel",ch,"TV volume",vol); 
    }else 
    { 
     return String.format("%s :%s\n%s:%d\n%s :%d","TV is switched","ON","TV channel",ch,"TV volume",vol); 
    } 

Вы можете проверить флаг непосредственно вместо flag==false.

if(!flag) 
    { 
     return String.format("%s :%s\n%s:%d\n%s :%d","TV is switched","OFF","TV channel",ch,"TV volume",vol); 
    }else if(flag) 
    { 
     return String.format("%s :%s\n%s:%d\n%s :%d","TV is switched","ON","TV channel",ch,"TV volume",vol); 
    } 
0

Сначала необходимо устранить повторяющиеся возвращения:

public String toString() 
{ 
    String onOrOff = flag ? "ON" : "OFF"; 
    return String.format("%s :%s\n%s:%d\n%s :%d","TV is switched",onOrOff,"TV channel",ch,"TV volume",vol); 
} 

Во-вторых, я не люблю C-стиль формирования строки:

public String toString() 
{ 
    String onOrOff = flag ? "ON" : "OFF"; 
    String result = "TV is switched :" + onOrOff + '\n' 
     + "TV channel:" + ch + '\n' 
     + "TV volume :" + vol; 
    return result; 
} 

В-третьих, вы можете определить Enum :

enum Power { ON, OFF }; 
Power onOrOff = Power.ON; 

public String toString() 
{ 
    String result = "TV is switched :" + onOrOff + '\n' 
     + "TV channel:" + ch + '\n' 
     + "TV volume :" + vol; 
    return result; 
} 
+0

Я ответил на оригинальный вопрос, который сильно отличался от реального. : - / – Ollbert