2016-11-01 9 views
1

カナダの郵便番号をA1A1A1またはA1A1という形式で検証するプログラムを作成しようとしています。私は、2番目の形式の空白を認識するためにコードを取得する際に問題があります。Javaの妥当性確認郵便番号

私はそれを実行し、2番目のフォーマットを試してみると、正当な郵便番号であっても2回無効と表示されます。

アイデア?

public class validatePostalCodeTest { 
    public static void main(String[] args) { 
    Scanner kb = new Scanner(System.in); 
    System.out.println("Please enter postalcode:"); 
    while (kb.hasNext()){ 
     String posCode = kb.next(); 
     if (posCode.length() > 7) 
      System.out.println("\nInvalid"); 
     if (posCode.length() < 6) 
      System.out.println("\nInvalid");  
     if (posCode.length()== 7){ 
      boolean valid = true; 
      for (int i = 0; i < posCode.length(); i++){ 
       char a = posCode.charAt(0); 
       char b = posCode.charAt(2); 
       char c = posCode.charAt(4); 
       char d = posCode.charAt(1); 
       char e = posCode.charAt(5); 
       char f = posCode.charAt(6); 
       char g = posCode.charAt(3); 
       if(! Character.isLetter(a)) 
        valid = false; 
       else if (! Character.isLetter(b)) 
        valid = false; 
       else if (! Character.isDigit(c)) 
        valid = false; 
       else if (! Character.isDigit(d)) 
        valid = false; 
       else if (! Character.isLetter(e)) 
        valid = false; 
       else if (! Character.isDigit(f)) 
        valid = false; 
       else if (! Character.isWhitespace(g)) 
        valid = false; 
       break; 
      } 
      if (valid) System.out.println("\nValid"); 
      else System.out.println("\nInvalid"); 
     } 
     if (posCode.length()== 6){ 
      boolean valid = true; 
      for (int i = 0; i < posCode.length(); i++){ 
       char a = posCode.charAt(0); 
       char b = posCode.charAt(2); 
       char c = posCode.charAt(4); 
       char d = posCode.charAt(1); 
       char e = posCode.charAt(3); 
       char f = posCode.charAt(5); 
       if(! Character.isLetter(a)) 
        valid = false; 
       else if (! Character.isLetter(b)) 
        valid = false; 
       else if (! Character.isLetter(c)) 
        valid = false; 
       else if (! Character.isDigit(d)) 
        valid = false; 
       else if (! Character.isDigit(e)) 
        valid = false; 
       else if (! Character.isDigit(f)) 
        valid = false; 
       break;      
      } 
      if (valid) System.out.println("\nValid"); 
      else System.out.println("\nInvalid"); 
     } 
     System.out.println("\nPlease enter a postalcode:"); 
    } 
    System.out.println("Program ending due to end-of-file"); 
    } 
} 
+0

入力が '「A1A 1A1」である場合は、'、そして 'posCode.charAt(0) posCode.charAt(2)は '' A ''、 'posCode.charAt(4)'は '' 1 ''です。 – ajb

+1

これは割り当てですか?正規表現ははるかに簡単かもしれません。 –

+0

私は適切な文字位置を固定しましたが、私はまだ同じ問題に遭遇しています - そして、これは割り当てであり、正規表現についてまだ教えられていないので、受け入れられるかわかりません。 – Arima

答えて

0

、あなたがA1A 1A1として郵便番号を入力する時期 は、だから、2回最初のものはA1Aであり、第二の1が1A1でそれを取るだろうし、そのための無効な出力2倍になります)それは1つのスペースを入れて2時間データがかかりますので、あなたはnextLineを(使用する必要があるとして、それは

チェック解決の答えの下に、あなたはあなたの問題を解決するのに役立ちます

public class validatePostalCodeTest 
{ 
    public static void main (String[] args) throws java.lang.Exception 
    { 

     Scanner kb = new Scanner(System.in); 
     System.out.println("Please enter postalcode:"); 
     String posCode = kb.nextLine(); 

     if (posCode.length() > 7) 
      System.out.println("\nInvalid"); 
     if (posCode.length() < 6) 
      System.out.println("\nInvalid");  
     if (posCode.length()== 7){ 
      boolean valid = true; 

      char a = posCode.charAt(0); 
      char b = posCode.charAt(2); 
      char c = posCode.charAt(4); 
      char d = posCode.charAt(1); 
      char e = posCode.charAt(5); 
      char f = posCode.charAt(6); 
      char g = posCode.charAt(3); 
      if(! Character.isLetter(a)) 
       valid = false; 
      else if (! Character.isLetter(b)) 
       valid = false; 
      else if (! Character.isDigit(c)) 
       valid = false; 
      else if (! Character.isDigit(d)) 
       valid = false; 
      else if (! Character.isLetter(e)) 
       valid = false; 
      else if (! Character.isDigit(f)) 
       valid = false; 
      else if (! Character.isWhitespace(g)) 
       valid = false; 

      if (valid) System.out.println("\nValid"); 
      else System.out.println("\nInvalid"); 
     } 
     if (posCode.length()== 6){ 
      boolean valid = true; 

      char a = posCode.charAt(0); 
      char b = posCode.charAt(2); 
      char c = posCode.charAt(4); 
      char d = posCode.charAt(1); 
      char e = posCode.charAt(3); 
      char f = posCode.charAt(5); 
      if(! Character.isLetter(a)) 
       valid = false; 
      else if (! Character.isLetter(b)) 
       valid = false; 
      else if (! Character.isLetter(c)) 
       valid = false; 
      else if (! Character.isDigit(d)) 
       valid = false; 
      else if (! Character.isDigit(e)) 
       valid = false; 
      else if (! Character.isDigit(f)) 
       valid = false; 


      if (valid) System.out.println("\nValid"); 
      else System.out.println("\nInvalid"); 
     } 
     System.out.println("Program ending due to end-of-file"); 
    } 
}  
+0

それはトリックをするように見えました!助けをありがとう – Arima

+0

コーディングをお楽しみください... – Vickyexpert

-1

私はちょうどここに正規表現を使用します。ここで

boolean isPostalCodeValid (String postalcode) { 
    return postalcode.matches("^\\w\\d\\w\\d\\w\\d|\\w\\d\\w\\s\\d\\w\\d$")); 
} 

デモ:

ideone

+0

私のインストラクターは、正規表現についてまだ教えていないので、これが受け入れられるかどうかはわかりません。 – Arima

+0

正規表現は絶対にこの問題を解決する方法だと思います。 SOを検索している他の人がこのアプローチの恩恵を受けるので、私はここでこの答えを残します。 –

+0

ブロックする必要がない場合は、単にString.matches( "")を返すことができます – Jobin

-1
public class validatePostalCodeTest { 
    public static void main(String[] args) { 
     Scanner kb = new Scanner(System.in); 
     System.out.println("Please enter a Postcode:"); 
     while (kb.hasNext()){ 
      String posCode = kb.next(); 

      if (posCode.length()== 7){ 
       boolean valid = true; 
        char a = posCode.charAt(0); 
        char b = posCode.charAt(2); 
        char c = posCode.charAt(4); 
        char d = posCode.charAt(1); 
        char e = posCode.charAt(5); 
        char f = posCode.charAt(6); 
        char g = posCode.charAt(3); 
        if(! Character.isLetter(a)) 
         valid = false; 
        else if (! Character.isLetter(b)) 
         valid = false; 
        else if (! Character.isLetter(c)) 
         valid = false; 
        else if (! Character.isDigit(d)) 
         valid = false; 
        else if (! Character.isDigit(e)) 
         valid = false; 
        else if (! Character.isDigit(f)) 
         valid = false; 
        else if (! Character.isWhitespace(g)) 
         valid = false; 

       if (valid) System.out.println("\nValid"); 
       else System.out.println("\nInvalid"); 
      } 
      else if (posCode.length()== 6){ 
       boolean valid = true; 
        char a = posCode.charAt(0); 
        char b = posCode.charAt(2); 
        char c = posCode.charAt(4); 
        char d = posCode.charAt(1); 
        char e = posCode.charAt(3); 
        char f = posCode.charAt(5); 
        if(! Character.isLetter(a)) 
         valid = false; 
        else if (! Character.isLetter(b)) 
         valid = false; 
        else if (! Character.isLetter(c)) 
         valid = false; 
        else if (! Character.isDigit(d)) 
         valid = false; 
        else if (! Character.isDigit(e)) 
         valid = false; 
        else if (! Character.isDigit(f)) 
         valid = false; 

       if (valid) System.out.println("\nValid"); 
       else System.out.println("\nInvalid"); 
      } 
else{ 
System.out.println("\nInvalid Length"); 
} 

      System.out.println("\nPlease enter a Postcode:"); 
     } 
     System.out.println("Program ending due to end-of-file"); 
    } 

    } 

それを最適化した上でlogic.Iを試してみてください。あなたは、空間分離してデータを読み込みますどのkb.next()を使用していた

+0

私はこのメソッドを試しましたが、私はまだ同じ問題が発生しています – Arima

+0

何ですかあなたの入力?? –

+0

私はA1Aを入力しました1A1 – Arima

0

コードを単純化することから始めましょう。

あなたのループは今までどの理由で、すべてのループを気に、問題を提起ん、あなたがそれらの終わりにbreakを持っていることを考えると、一度最大で実行されますか?

あなたはカナダの郵便番号の一般的な形式は形式、説明:スペースなしのため

/[A-Z]\d[A-Z]\d[A-Z]\d/ 

を、そして[A-Z]はA大文字の文字クラスを表す

/[A-Z]\d[A-Z]\s\d[A-Z]\d/ 

を... 0〜9の数字を表し、\sは、空白文字を表します。あなたは正規表現を使用していないことを知っていますが、これは私がを表すあなたが解決する必要があるデータを計画する方法です。

まず、スペースを入れずにケースを簡略化してみましょう。それはあなたの全体の2番目のループです。まず、スキャナで使用するためにnextからnextLine()に切り替えることから始めます。

String posCode = kb.nextLine(); 

は今、私たちは単にでその行全体を読んで、その長さを確認したいです。それが6に等しいなら、私たちは続けます - あなたのコードはすでにこれを行います。

if(posCode.length() == 6) { 
    // validation logic 
} 

ここではトリッキーな部分です。あなたは上記の正規表現を思い出していますか?

  • であっても、場所の文字が
  • 奇数位の文字が0からの数字でなければなりませんAからZまでの文字でなければなりません9.
へ:ので、それらのパターンがあることが起こります

これで、このロジックに基づいていくつかのことを確認するためのループを構築できます。否定はCharacter.isLetterCharacter.isDigitです。

for(int i = 0; i < posCode.length(); i++) { 
    if(i % 2 == 0) { // even digits 
     if(!Character.isLetter(posCode.charAt(i))) { 
      // reject! 
      System.out.println("Invalid!"); 
      break; 
     } 
    } else { // odd digits 
     if(!Character.isDigit(posCode.charAt(i))) { 
      // reject! 
      System.out.println("Invalid!"); 
      break; 
     } 
    } 
} 

現実的に言えば、これだけです。空白文字は特殊なケースであり、スキップすることで簡単に無視することができます。

int spaceLocation = posCode.indexOf(" "); 
if(spaceLocation != -1) { 
    // carve the space out and concatenate 
    posCode = posCode.substring(0, spaceLocation) + posCode.substring(spaceLocation + 1, posCode.length()); 
} 

上記を実行することで、1つの方法のみが必要となり、両方のケースを正常に検証できます。

0

多くのif-elseステートメントを減らし、コードの行を減らすことができます。

次のコードは、あなたと同じロジックを持っていて、それを望むように、郵便番号をチェックします:

public class validatePostalCodeTest { 

    public static void main(String[] args) throws java.lang.Exception { 

     Scanner kb = new Scanner(System.in); 
     System.out.println("Please enter postalcode:"); 
     char charPC[] = kb.nextLine().toCharArray(); 
     boolean valid = false; 

     if (charPC.length == 7) { 
      if (Character.isLetter(charPC[0]) && Character.isLetter(charPC[2]) && Character.isLetter(charPC[5]) 
        && Character.isDigit(charPC[4]) && Character.isDigit(charPC[1]) && Character.isDigit(charPC[6]) 
        && Character.isWhitespace(charPC[3])) { 
       valid = true; 
      } 
     } 

     else if (charPC.length == 6) { 
      if (Character.isLetter(charPC[0]) && Character.isLetter(charPC[2]) && Character.isLetter(charPC[4]) 
        && Character.isDigit(charPC[1]) && Character.isDigit(charPC[3]) && Character.isDigit(charPC[5])) { 
       valid = true; 
      } 
     } 

     if (valid) 
      System.out.println("\nValid"); 
     else 
      System.out.println("\nInvalid"); 

     System.out.println("Program ending due to end-of-file"); 
    } 
}