计算有多少列表条目具有以特定char结尾的字符串属性

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计算有多少列表条目具有以特定char结尾的字符串属性相关的知识,希望对你有一定的参考价值。

我有一个数组列表,里面有一些名字(名字和姓氏)。我要做的就是浏览每个“名字”,看看一个字符(用户指定的字符)出现在数组列表中每个名字末尾的次数,然后打印出该字符的次数出现了。

public int countFirstName(char c) {
    int i = 0;
    for (Name n : list) {
        if (n.getFirstName().length() - 1 == c) {
            i++;
        }
    }
    return i;
}

那是我的代码。问题是即使有一个字符与第一个名字的末尾匹配,计数器(i)也不会加1。

答案

您将字符串中最后一个字符的索引与所需字符进行比较,而不是使用charAt访问的最后一个字符本身:

String firstName = n.getFirstName()
if (firstName.charAt(firstName.length() - 1) == c) {
    i++;
}
另一答案

当你开始学习编码时,使用铅笔和纸张,或者用你想到的语言提前描述你的算法是很有价值的。大多数学习外语的人都是从一个句子开始他们的母语,将其翻译成外国语,然后说外语。很少(如果有的话)外语学习者能够在本地思考

编码也不例外;你一辈子都在说英语并思考它。现在,您的目标是学习不同的思维模式,语法和关键词。如果您执行以下操作,此任务将更加轻松:

  • 用高级自然语言解决你想要做的事情
  • 用清晰简单的语言写下步骤,就像食谱一样
  • 不要试图一次做太多

如果我是一名标记你的程序的导师,id一直在寻找这样的东西:

//method to count the number of list entries ending with a particular character
public int countFirstNamesEndingWith(char lookFor) {
  //declare a variable to hold the count
  int cnt = 0;

  //iterate the list 
  for (Name n : list) {

    //get the first name
    String fn = n.getFirstName();

    //get the last char of it
    char lc = fn.charAt(fn.length() - 1);

    //compare
    if (lc == lookFor) {
        cnt++;
    }
  }
  return cnt;
}

轮流拿下要点:

这些评论是对必须做的事情的高级描述。在编写一行代码之前,我们首先将它们写为aLL。我的课程惩罚了未注释的代码,并且首先编写它们是一种方便的方法来解决需求(它们是一件苦差事,对吧?不总是,但是......)而且编写逻辑算法真的很容易高级语言,然后将步骤转换为语言学习。我绝对认为如果你采用这种方法你就不会犯下你所做的错误,因为很明显你写的代码没有实现你之前描述过的算法。

不要试图在一行中做太多。是的,我确信很多编码人员认为它看起来很酷,或者技巧,或者展示了他们有什么令人印象深刻的编码智能,它们将一个好的10行算法打包成一行代码,这些代码使用了一些不起眼的语言功能但是有一天它很高可能是其他人不得不来维护代码,改进代码或改变它的一部分 - 那时它已经不再酷了,而且从来都不是真的很聪明

Aominee在他们的评论中,实际上给了我们一个类似的例子:

return (int)list.stream().filter(e -> e.charAt.length()-1)==c).count();

这是解决问题的一线实现。好吧?好吧,它有一个错误*(一开始),但它不是我的论点的主旨。在更基础的层面:你知道它在做什么吗?你能看一下吗?在2秒内告诉我它是如何工作的?

这是一个相当高级的语言功能,这是肯定的技巧,但它可能是一个非常糟糕的解决方案,因为它很难理解,很难维护,并且看起来像一点点做了很多 - 只有你才真正有意义我精通语言。这一行捆绑了一个循环遍历列表的工具,这个功能实际上有一个微小的子方法,可以为列表中的每个项目调用,其工作是计算名称是否以搜索到的字符结尾

它是一个很棒的功能,一个可爱的例子,它肯定在生产java中有它的位置,但它的位置可能不在这里,在你的学习练习中

同样地,我会尽量说出你的这一行:

    if (n.getFirstName().length() - 1 == c) {

正在接近“做太多” - 我说这是因为这是你的逻辑崩溃的地方;你没有编写足够的代码来有效地实现算法。您实际上必须编写更多代码来实现这种方式:

    if (n.getFirstName().charAt(n.getFirstName().length() - 1) == c) {

这是加入大脑并理解的右眼。接受的答案首先将名称转换为临时变量,从而将其分解。这是一个明智的优化。我通过将最后一个字符变成临时变量来打破另一步。在生产系统中,我可能不会那么远,但这是你的学习阶段 - 尽量减少你的每一行的操作次数。它将帮助您理解您自己的代码

如果您喜欢在尽可能少的字符中编写尽可能多的代码,请在堆栈交换网络上查看一些代码高尔夫游戏;游戏是滥用尽可能多的语言功能,以制作真正简短的特技代码。几乎每个赢家都是凝聚的证明,永远不应该被放入由正常程序员维护的生产系统中,他们重视他们的理智

*错误是它没有从Name对象中获取名字

以上是关于计算有多少列表条目具有以特定char结尾的字符串属性的主要内容,如果未能解决你的问题,请参考以下文章

Parse iOS 有多少次相同的条目?

计算包含特定字符串的条目的度量

计算一个序列有多少个不同的01子序列

MySQL获取以特定名称结尾的表列表及其(表的)注释

删除 pandas DataFrame 列中字符串条目的结尾

处理数据源(根据条目字数多少 ,动态显示一行里有多少个条目,类似天猫搜索历史)