【问题标题】:Search an array for missing information在数组中搜索缺失的信息
【发布时间】:2016-08-03 01:37:06
【问题描述】:

我需要找到一种方法来搜索电子邮件并找出数组中的电子邮件字段是否缺少“@”、“。”或有空格。

到目前为止,我已经找到了 http://www.tutorialspoint.com/java/util/arraylist_contains.htmhttp://www.tutorialspoint.com/java/lang/string_contains.htm 。这很好,但仍然让我感到困惑。

我有一个获取电子邮件的方法 (getEmail),我试图弄清楚它如何循环遍历 myRoster 数组并打印出每封缺少该信息的电子邮件。任何澄清或帮助将不胜感激。

【问题讨论】:

  • 请在edit 中分享您正在使用的代码。您真正需要的只是一个简单的“for 循环”和一个字符串比较。 ArrayList.contains 不需要
  • 建议标题:在字符串数组中搜索一个字符。

标签: java arrays contains


【解决方案1】:

之前的发帖人指出在迭代字符串时使用“布尔标志”。如果您正在做一些微观的性能优化,这没关系,但我认为与使用一些更简单的方法(如String#indexOf)相比,这有点过度优化。

public boolean hasValidEmail(String email) {
    int at = email.indexOf('@');
    //first ensures '@' exists, then that '.' is after '@', and lastly checks for no space
    return at > 0 && email.lastIndexOf('.') > at && !email.contains(' ');
}

这绝对不是完美的,并且有人尝试对此类事情进行正则表达式验证,但对于简单的检查来说已经绰绰有余了。

如果您真的只想进行一次字符串迭代,您可以迭代#toCharArray。虽然我建议只使用直接字符比较而不是 #compareTo:

char c = /* some char */;
if (c == '@') {
    //etc
}

简而言之,“过早的优化是万恶之源”。优化当然没问题,但还有更好、更现代的方法,比如找出代码缓慢的原因。

【讨论】:

  • 整个电子邮件验证问题比您想象的要复杂得多。事实证明,您不能真正编写完全验证 RFC 标准的正则表达式。我也找不到任何似乎可以接受的公共图书馆。限制性更强的解决方案往往很脆弱,许多人无法接受新的 TLD。因此,您最好使用上述简单的解决方案或简单的正则表达式,例如: [A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z] 然后发送他们是一封电子邮件,需要采取一些行动,这是一种久负盛名的方法。
  • 确实,我认为较长的其中之一是300行左右的荒谬?从字面上看,有一个网页比较了各种正则表达式,它们只是变得......很大。
  • 最大的罪过是拒绝用户服务。我刚刚了解到 TLD 现在接受非英语字符集,如日本汉字。所以我什至为我的简单正则表达式感到后悔。
【解决方案2】:

循环遍历电子邮件字符串,并将您要查找的每个字符的布尔标志设置为 false。如果您找到要搜索的字符,请将标志设置为 true。在循环结束时,如果标志仍然为假,则找不到字符。

例如..

Boolean atFound = false;
Boolean periodFound = false;
Boolean spaceFound = false;
For (integer cnt = 0; cnt < email.length; cnt ++)
{
    If (email [cnt].compareTo ("@") == 0)
        atFound = true;
    If (email [cnt].compareTo (".") == 0)
        periodFound = true;
    If (email [cnt].compareTo (" ") == 0)
        spaceFound = true;
}

【讨论】:

  • 感谢所有帮助和建议!我将不得不尝试这两个答案,但我认为卢克的答案将是最好的途径。
猜你喜欢
  • 2011-10-11
  • 2019-09-03
  • 1970-01-01
  • 1970-01-01
  • 2013-02-27
  • 1970-01-01
  • 1970-01-01
  • 2022-12-18
  • 1970-01-01
相关资源
最近更新 更多