【问题标题】:Is there a function to count iterations of for each loops in Java?是否有一个函数可以计算 Java 中每个循环的迭代次数?
【发布时间】:2021-01-10 15:18:38
【问题描述】:

我开始使用 Java,我正在创建一个基本的电话簿应用程序。 我想实现一个“搜索联系人”函数,该函数在联系人的 ArrayList 中进行搜索,并使用 for each 循环和 if 语句返回与用户输入的字符串匹配的联系人数量。 问题是,是否可以接收与用户搜索输入相匹配的联系人计数,而无需先定义一个 int - 例如 int counter = 0; - 然后在 if 语句中更新它?

以下是我所知道的唯一可以计算匹配联系人数量的方法示例:

int counter = 0;

System.out.println("Please enter name of contact: ");

String nameRequest = scanner.nextLine();


for (Contact c: contactList) {
    if (nameRequest.equals(c.getName())){
    counter++;
    System.out.println(counter + " contact(s) found"
    System.out.println("Name: " + c.getName());
    }
}

附加:我该怎么做才能使代码也返回仅部分匹配的联系人?例如用户输入“Michael”,但没有包含“Michael”的联系人。但是,我希望在部分比赛中返回名为“Michael B Jordan”和“Michael Schumacher”的联系人。

提前致谢!

【问题讨论】:

  • 计数器变量几乎是执行此类操作的标准方法。对于部分匹配,请检查字符串方法 containsstartsWithtoLowerCase
  • 您也可以过滤 ArrayList(参见 stackoverflow.com/questions/122105/…),然后检查过滤后列表的长度,但要注意这些看起来很漂亮,但对于较大的列表可能会很昂贵。

标签: java foreach


【解决方案1】:

在这种情况下,使用计数器变量是人们的标准。但如果是出于学习目的,您可以使用 Lambda 来实现,您首先选择联系人,获取姓名并存储在临时列表中:

List<String> contactsFound = contactList.stream()
    .map(Contact::getName)
    .filter(nameRequest::equals)
    .collect(Collectors.toList());

System.out.println(contactsFound.size() + " contact(s) found");

contactsFound.forEach(contactName -> System.out.println("Name: " + contactName));

【讨论】:

  • 您可以将过滤器替换为s -&gt; s.toLowerCase().contains(nameRequest.toLowerCase()) 以查找部分匹配项(不区分大小写)。
【解决方案2】:

这是与兄弟回答相同的基本解决方案,但带有 for 循环(如问题中所示):

List<String> contactsFound = new ArrayList<>();
for (Contact c: contactList) {
    if (c.getName().toLowerCase().contains(nameRequest.toLowerCase())){
        contactsFound.add(c.getName());
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-08
    • 2011-09-10
    • 2019-07-26
    • 1970-01-01
    • 2013-10-11
    相关资源
    最近更新 更多