【问题标题】:Calling a method within methods在方法中调用方法
【发布时间】:2021-12-05 21:55:56
【问题描述】:

Java 新手。我今晚有一个作业要交,但我被( ) 中需要分配的东西困住了。这是对电子邮件前缀的验证,我从我用来获取前缀的方法中调用前缀“示例”。任何帮助将不胜感激!

public static boolean isValidPrefixChar(char b) {
        return isAlphaNumeric(b) || b == '.' || b == '-' || b == '_';

这就是我所说的:

public static boolean isValidPrefix(String str4) {
        getPrefix("example@mail.com");
        isValidPrefixChar(???);

请,谢谢!

【问题讨论】:

  • 您是否应该对getPrefix() 调用结果中的每个字符进行验证?
  • 是的,我应该验证每个字符。
  • 我现在明白你关于迭代的观点了,下面有一个例子。没有正确执行此操作。将在这方面进行更多工作。谢谢。

标签: java methods types


【解决方案1】:

tl;博士

要直接回答您的问题,请确定字符串第一个字符的 char 值。致电String#charAt。不幸的是,该方法使用烦人的从零开始的索引计数。所以第一个字符是违反直觉的零而不是一。

isValidPrefixChar( prefix.charAt( 0 ) );

但是……最好避免使用char 类型。传递一个代码点编号:

isValidPrefixChar( prefix.codePointAt( 0 ) ); // Pass code point number assigned to the first (index zero) character of your input string.

char 已过时

char 类型自 Java 2 以来一直存在。作为 16 位值,它在物理上无法表示大多数字符。而是使用code point 整数。

代码点

每个已知字符都被分配了一个特定的永久编号作为标识符。此号码称为code point

  • . = 完全停止 = 十进制数 46
  • - = HYPHEN-MINUS = 45 十进制
  • _ = LOW LINE = 95 十进制

您对单个字符的检查将采用 int 参数作为代码点。

public static boolean isValidPrefixCharacter ( int codePoint )
{
    if ( ! Character.isValidCodePoint( codePoint ) ) { throw new IllegalArgumentException( "Invalid code point number passed." ); }
    return
            Character.isLetterOrDigit( codePoint )
                    || codePoint == ".".codePointAt( 0 )  // Annoying zero-based index counting.
                    || codePoint == "-".codePointAt( 0 )
                    || codePoint == "_".codePointAt( 0 )
            ;
}

我假设编译器对.codePointAt 的调用将是inlined,但我不确定。

该方法会从另一个类似的方法中调用。

public static boolean isValidPrefix ( String possibleEmailAddress )
{
    Objects.requireNonNull( possibleEmailAddress );
    if ( possibleEmailAddress.isBlank() ) { throw new IllegalArgumentException( "Possible email address must have some not text, not empty string." ); }
    int codePointOfFirstCharacter = possibleEmailAddress.codePointAt( 0 );   // Annoying zero-based index counting.
    boolean isPrefixValid = isValidPrefixCharacter( codePointOfFirstCharacter );
    return isPrefixValid;
}

示例线束代码。

boolean isValid = App8.isValidPrefix( "example@example.com" );
System.out.println( "isValid = " + isValid );

isValid = App8.isValidPrefix( "?example@example.com" );
System.out.println( "isValid = " + isValid );

运行时。

isValid = true
isValid = false

后来你澄清说你想检查每个角色,而不仅仅是第一个。在这种情况下,修改那个方法。

public static boolean isValidPrefix ( String possibleEmailAddress )
{
    Objects.requireNonNull( possibleEmailAddress );
    if ( possibleEmailAddress.isEmpty() ) { throw new IllegalArgumentException( "Possible email address must have some not text, not empty string." ); }
    String emailPrefix = possibleEmailAddress.split( "@" )[ 0 ];  // Annoying zero-based index counting.
    int[] codePoints = emailPrefix.codePoints().toArray();
    for ( int codePoint : codePoints )
    {
        boolean isCharacterValid = isValidPrefixCharacter( codePoint );
        if ( ! isCharacterValid ) { return false; }
    }
    return true;
}

并扩展我们的测试。

boolean isValid = App8.isValidPrefix( "example@example.com" );
System.out.println( "isValid = " + isValid );

isValid = App8.isValidPrefix( "?example@example.com" );
System.out.println( "isValid = " + isValid );

isValid = App8.isValidPrefix( "example?@example.com" );
System.out.println( "isValid = " + isValid );

运行时。

isValid = true
isValid = false
isValid = false

【讨论】:

【解决方案2】:

您需要对前缀进行迭代,并检查前缀的每个字符是否有效:

public static boolean isValidPrefixChar(char b) { 
    return isAlphaNumeric(b) || b == '.' || b == '-' || b == '_';
}

public static boolean isValidPrefix(String str4) {
    String s = getPrefix("example@mail.com");
    for(int i = 0 ; i < s.length; i++){
        if(!isValidPrefixChar(s.charAt(i)){
            return false;
        }
    }
    return true;
}

【讨论】:

  • 一旦发现无效字符就继续迭代是很浪费的。只需返回 false。
  • @shmosel 谢谢你的评论,我改了。我写得很快
  • 问题是我需要调用该方法。抱歉,没有说清楚。
  • 我实际上有下面的 for 循环在等待,但是当我调用这个方法时,我只是不明白在 ( ) 中放入什么。
  • 在这里完全错过了你的观点。我的错。如果我刚刚读到这句话,我会减轻很多眼睛疲劳。感谢您尝试提供帮助!将同样应用这一点。直到它工作正常才完成。
猜你喜欢
  • 1970-01-01
  • 2012-09-28
  • 2020-09-17
  • 2015-05-17
  • 1970-01-01
  • 1970-01-01
  • 2015-06-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多