我正在尝试编写一个程序,用于验证格式为A1A1A1或A1A 1A1的加拿大邮政编码。我在让代码识别第二种格式的空格时遇到问题。
当我运行它并尝试第二种格式时,即使它是合法的邮政编码也会说无效两次。
有什么想法吗?
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 :(得分:1)
您已使用kb.next()
来读取空格分隔的数据,
因此,当您输入邮政编码为A1A 1A1
时,它将需要2次,第一次是A1A
,第二次是1A1
因此,您将获得2次无效输出,因为它需要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");
}
}
答案 1 :(得分:0)
让我们从简化代码开始。
你的循环最多只能执行一次,因为你的结尾有一个break
,这确实引发了一个问题,为什么还要烦恼呢?
您描述了加拿大邮政编码格式,其格式为:
/[A-Z]\d[A-Z]\d[A-Z]\d/
没有空格,
/[A-Z]\d[A-Z]\s\d[A-Z]\d/
...其中[A-Z]
表示大写字符类A到Z,\d
表示从0到9的数字,\s
表示空白字符。我知道您没有使用正则表达式,但这就是我计划表示您需要解决的数据的方式。
让我们从简化案例开始,没有空格。那是你的第二个循环。我们首先从next
切换到nextLine()
,以便在我们的扫描仪中使用。
String posCode = kb.nextLine();
现在,我们想简单地读取整行并检查其长度。如果它等于6,我们继续 - 你的代码已经这样做了。
if(posCode.length() == 6) {
// validation logic
}
现在这里是棘手的部分。你还记得我上面提到的正则表达式吗?碰巧有这样的模式:
有了这个,我们可以构建一个循环来根据这个逻辑为我们检查一些事情。请注意Character.isLetter
和Character.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());
}
通过执行上述操作,您只需要一种方法,即可成功验证这两种情况。
答案 2 :(得分: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");
}
}
答案 3 :(得分:-1)
我只想在这里使用正则表达式:
boolean isPostalCodeValid (String postalcode) {
return postalcode.matches("^\\w\\d\\w\\d\\w\\d|\\w\\d\\w\\s\\d\\w\\d$"));
}
在这里演示:
答案 4 :(得分:-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");
}
}
请尝试以上逻辑。我已对其进行了优化。