陈落轩 发表于 2023-10-23 00:18:00

Java判断名字始终无法正确进入判断

package test1;

public class Name {
    protected String firstName,lastName;

    public Name(String firstName, String lastName) {
      this.firstName = firstName;
      this.lastName = lastName;
    }
   
    public String getFirst() {return firstName;}
    public String getLast() {return lastName;}
   
    public static void main(String[] args) {
            String nameS1 = "Jiakai He";
            String nameS2 = "Kong, Jason";
            Name name1 = NameFactory.getName(nameS1);
            Name name2 = NameFactory.getName(nameS2);
            System.out.println(nameS1 + ", first name:" + name1.getFirst() +
           ", last name:"+name1.getLast());
            System.out.println(nameS2 + ", first name:" + name2.getFirst() +
           ", last name:"+name2.getLast());
    }
}

class FirstFirst extends Name {
    public FirstFirst(String firstName, String lastName) {
      super(firstName, lastName);
    }

}

class LastFirst extends Name {
    public LastFirst(String firstName, String lastName) {
      super(firstName, lastName);
    }
}

class NameFactory {
    public static Name getName(String s) {
      String[] parts = s.split(" ");
      if (parts.length == 2) {
            // 判断 "first last" 格式
            return new FirstFirst(parts, parts);
      } else if (s.contains(",")) {
            // 判断 "last, first" 格式
            String[] commaParts = s.split(", ");
            return new LastFirst(commaParts, commaParts);
      } else {
              throw new IllegalArgumentException("不合法格式");
      }
    }
}这里的NameFactory,我想按照是否有空格与是否有逗号分类,但是始终没办法进入else if 语句,而且最终输出的结果也有问题,请问大佬们这是为什么呢

isdkz 发表于 2023-10-23 00:18:01

问题在于判断逗号的代码中使用了s.contains(",") ,这个条件不够严谨,因为名字中可能会包含逗号,例如 "Smith, John Jr."。应该使用s.indexOf(",") != -1来判断是否有逗号。另外,判断空格的代码可以使用s.indexOf(" ") != -1来代替s.split(" ").length == 2 ,这样可以避免不必要的字符串分割操作。修改后的代码如下:

class NameFactory {
    public static Name getName(String s) {
      if (s.indexOf(",") != -1) { // 判断 "last, first" 格式
            String[] commaParts = s.split(", ");
            return new LastFirst(commaParts, commaParts);
      } else if (s.indexOf(" ") != -1) { // 判断 "first last" 格式
            String[] parts = s.split(" ");
            return new FirstFirst(parts, parts);
      } else {
            throw new IllegalArgumentException("不合法格式");
      }
    }
}


这样就可以正确地判断名字格式并创建相应的对象了。

Mike_python小 发表于 2023-10-23 00:18:47

请问您在运行代码时,输入的是什么样的姓名字符串呢?如果您运行代码时输入的姓名字符串符合 "first last" 格式,那么程序应该能够正确进入if语句并输出结果。如果输入的姓名字符串符合 "last, first" 格式,那么程序应该能够正确进入else if语句并输出结果。

但是,如果您输入的字符串既不符合 "first last" 格式,也不符合 "last, first" 格式,那么程序将会抛出IllegalArgumentException异常。因此,如果您想要测试else if语句的执行情况,可以尝试输入一个包含逗号但不是 "last, first" 格式的字符串,例如 "Kong Jason,",此时程序应该能够进入else if语句并抛出异常。

另外,请注意您的代码中存在一个错误,即FirstFirst类和LastFirst类的构造方法应该交换firstName和lastName的参数位置。正确的构造方法应该如下所示:


class FirstFirst extends Name {
    public FirstFirst(String firstName, String lastName) {
      super(firstName, lastName);
    }
}

class LastFirst extends Name {
    public LastFirst(String firstName, String lastName) {
      super(lastName, firstName);
    }
}


希望以上答案对您有所帮助。

球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:}
页: [1]
查看完整版本: Java判断名字始终无法正确进入判断