【问题标题】:problem with this string comparing method这个字符串比较方法的问题
【发布时间】:2019-08-03 11:34:09
【问题描述】:

下面的方法需要返回字典中第一个姓氏的人的名字。在姓氏相同的情况下,该方法将比较人员的名字,并根据字典确定其中的名字。 例如 : 给定的名称:“dan”、“coco”、“rocky”。将返回名称“coco”,因为字典中“c”在“d”之前。 方法是:

 public String firstPerson()
    {
        String   lastName=_persons[0].getLastName();
        String firstName=_persons[0].getFirstName();
        String answer=_persons[0].getFirstName();
        for(int i=0;i<_numOfPersons;i++)
        {
            if((_persons[i].getLastName().compareToIgnoreCase(lastName))>0)
            {
                lastName=_persons[i].getLastName();
                answer=_persons[i].getFirstName();
            }
            else if((_persons[i].getLastName().compareToIgnoreCase(lastName))==0)
            {
                if((_persons[i].getFirstName().compareToIgnoreCase(firstName))>0)
                answer=_persons[i].getFirstName();
            }
        }
        return answer;
    }

我认为这是解决方案,但由于某种原因,该方法总是返回数组中的最后一个人,而不是我需要的那个人。

【问题讨论】:

  • &gt;0 更改为&lt;0
  • 换一种说法,getLastName().compareToIgnoreCase(lastName)) &gt; 0 在此上下文中的意思是:如果此人的姓氏按字典顺序排在lastName 之后,则更新lastName。这意味着结果总是按字典顺序排列的姓氏,而您想要相反的结果。

标签: java arrays string methods


【解决方案1】:

本质上,您是在尝试通过复合比较器找到最小值。与其自己实现,不如让 Java 的流和比较器为您完成繁重的工作:

public String firstPerson() {
    return Arrays.stream(persons)
                 .min(Comparator.comparing(Person::getLastName, 
                                           String.CASE_INSENSITIVE_ORDER)
                                .thenComparing(Person::getFirstName, 
                                               String.CASE_INSENSITIVE_ORDER))
                 .orElse(null);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-29
    • 1970-01-01
    • 2019-05-04
    • 2017-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多