【问题标题】:Count how many list entries have a string property that ends with a particular char计算有多少列表条目具有以特定字符结尾的字符串属性
【发布时间】:2017-12-30 14:28:14
【问题描述】:

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

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

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

【问题讨论】:

  • 在您的代码中写下您希望代码遵循的算法的注释,然后检查代码是否实际实现了该算法..
  • 您将名字的长度与c 进行比较。虽然cchar,但它可以隐式转换为int。所以基本上,你的逻辑搞砸了。
  • @Turing85 哦,谢谢!我会尝试修复它:)

标签: java string char


【解决方案1】:

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

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

【讨论】:

  • 非常感谢你!我花了几个小时试图自己弄清楚! (您的解决方案有效):D
  • 注意空字符串会抛出异常。
【解决方案2】:

当您开始学习编码时,使用铅笔和纸,或者提前用您思考的语言描述您的算法非常有价值。大多数学习外语的人都是从汇编开始的用他们的母语写一个句子,翻译成外语,然后说外语。很少(如果有的话)外语学习者能够以母语进行思考

编码也不例外;你一生都在说英语并在里面思考。现在你的目标是学习不同的思维模式、句法和关键词。如果您:

  • 先用高级自然语言确定您想做什么
  • 用清晰简单的语言写下步骤,就像食谱一样
  • 不要试图一次做太多事情

如果我是给你的课程评分的导师,我一直在寻找这样的东西:

//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;
}

依次取要点:

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

不要试图在一行中做太多。是的,我敢肯定很多编码人员认为它看起来很酷,或者在欺骗,或者炫耀他们必须将一个好的 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 对象中获取名字

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-18
    • 2011-05-13
    • 1970-01-01
    • 1970-01-01
    • 2020-08-13
    • 1970-01-01
    相关资源
    最近更新 更多