如何按字母顺序在通讯录中订购联系人?

时间:2016-03-29 00:11:10

标签: java

任何人都可以帮助我吗? 我有一个方法作为管理联系簿的大型项目的一部分。

我需要使用String,所以没有数组。 如果可能,我想使用compareTo

描述如下:

此方法插入联系人行(例如联系人:

给定笔记本中的

6 | cori |ben | benben@hotmail.com | 4502334565)。联系线需要按姓氏的字母顺序排序。

此方法不验证dublicates。

参数预定我们要介绍联系线的书(来自参数)

我们假设这本书非空,但从一开始就是空的。

如果非空,则以这种方式形成:

/*
       3|Crevier|Simon|simon@gmail.com|5145678988 (contact line)
       1|Douglas|Sylvie|nothing|4507461234
       2|Dumoulin|Fred|fredd@yahoo.ca|nothing
       4|Girard|Myriam|nothing|nothing

*/

参数contactLine联系人格式化需要添加到书中的一行

我们假设接触线为非null,非空且格式良好(如示例中所示)

插入后新书的新字符串。新归还的书需要很好地格式化。

此方法需要使用另一种方法:来自同一类的findLastNameContact()方法(方法从联系人行的前一行获取姓名:3 |Crevier | Simon \ simimon @ gmail.com | 5145678988)=> Crevier是姓氏。

我们需要忽略这个案例。

/*
----------------------------------------------

METHOD IF CONTACT IS INSERTED IN THE BOOK 
----------------------------------------------
Insert 1|crook|hubert|hubcrook@gmail.com|4502765009 in the empty book... ERROR

Expected:
1|crook|hubert|hubcrook@gmail.com|4502765009

Have found:



Instert 2|aubre|Camille|aucun|5149098778... ERROR

Expected:

2|Aubre|Camille|aucun|5149098778

1|crook|hubert|hubcrook@gmail.com|4502765009

Have found:

1|crook|hubert|hubcrook@gmail.com|45027650092|aubre|Camille|aucun|5149098778

1|crook|hubert|hubcrook@gmail.com|4502765009

Instert 3|charland|Marc|mcrook@yahoo.ca|nothing... ERROR - 
NoSuchElementException unexpected.

Instert 4|mason|Isabelle|aucun|aucun... ERROR - NoSuchElementException unexpected.

Insert 5|fortin|Bruno|brunofortin@hotmail.com|5142768898... ERROR - NoSuchElementException unexpected.

Insert 6|ZHE|Xang|zzz@hotmail.com|4598765423... ERROR - NoSuchElementException unexpected.

Insert 7|morier|Dominic|doum@videotron.ca|4598765423... ERROR

Expected:

    2|Aubre|Camille|aucun|5149098778

    3|CHaRland|Marc|mcrook@yahoo.ca|aucun

    1|crook|hubert|hubcrook@gmail.com|4502765009

    5|Fortin|Bruno|brunofortin@hotmail.com|5142768898

    4|Mason|Isabelle|aucun|aucun

    7|Morier|Dominic|doum@videotron.ca|4598765423

    6|ZHE|Xang|zzz@hotmail.com|4598765423

    Have found  :

    2|Aubre|Camille|nothing|5149098778

    3|CHaRland|Marc|mcrook@yahoo.ca|nothing

    1|crook|hubert|hubcrook@gmail.com|4502765009

    5|Fortin|Bruno|brunofortin@hotmail.com|5142768898

    4|Mason|Isabelle|nothing|nothing
    6|ZHE|Xang|zzz@hotmail.com|45987654237|morier|Dominic|doum@videotron.ca|4598765423
    nothing

    6|ZHE|Xang|zzz@hotmail.com|4598765423


Insertion 8|alban|Roger|Roger@gmail.com|5143677788... ERROR - NoSuchElementException unexpected.

*/
public static String InsertThisContactInTheBook
    (String book, String contactLine) {


        String lastNameContact;
        String id, lastName, givenName, email, phone;
        String newBook = "";

        lastNameContact= findLastNameContact(contactLine);//contact line is from outside, also the findLastNameContact, witch is extraxting la last name from contact line

     //6|cori|ben|benben@hotmail.com|4502334565| (example of contact line)

        StringTokenizer tokens = new StringTokenizer(book, "|");

        // newBook = book+ contactLine;

        while (tokens.hasMoreTokens()){
            id = tokens.nextToken();
            lastName = tokens.nextToken();
            givenName = tokens.nextToken();
            email= tokens.nextToken();
            phone= tokens.nextToken();

            if (lastName.compareToIgnoreCase(lastNameContact) > 0) {
                newBook = book + contactLine +  "\n" + id + "|" + lastName + "|" + givenName + "|" + email+ "|" + phone+ "\n";
            }
        }
        return newBook;
    }

1 个答案:

答案 0 :(得分:0)

这是家庭作业吗?如果是,你应该告诉我们。

首先,在我看来,您在book中使用了两种不同的分隔符:|分隔符,用于分隔每个contactLine内的数据字段},以及用于在\n内分隔单个contactLine的{​​{1}}换行符分隔符。

请参阅代码的此部分:

book

因此,在if (lastName.compareToIgnoreCase(lastNameContact) > 0) { newBook = book + contactLine + "\n" + id + "|" + lastName + "|" + givenName + "|" + email+ "|" + phone+ "\n"; } 上分隔的StringTokenizer将解析|,就像它的格式如下:

book

实际上两个contactLines应该是:

6|ZHE|Xang|zzz@hotmail.com|45987654237|morier|Dominic|doum@videotron.ca|459876542|nothing

请注意,两个6|ZHE|Xang|zzz@hotmail.com|4598765423 7|morier|Dominic|doum@videotron.ca|459876542|nothing 之间缺少|分隔符。因此,代替contactLines识别5 + 6 = 11个令牌,它会将StringTokenizer标记为10个令牌,将book视为1个令牌而不是2个单独的令牌,459876542374598765423

第二次,您粘贴在上面的输出中的7条目还有另一个问题。在上面引用的例子中,“ZHE Xang”和“morier Dominic”中,两行包含不同的标记。 ZHE Xang的contactLine包含5个令牌,而morier Dominic包含6个令牌。因此,上面的contactLine循环无法可靠地工作 - 期望所有while有5个令牌,但有些明显有6个。

我引用了您的代码的这一部分:

contactLines

我认为这两个问题的最终结果实际上是同一个问题:它使while (tokens.hasMoreTokens()){ id = tokens.nextToken(); lastName = tokens.nextToken(); givenName = tokens.nextToken(); email= tokens.nextToken(); phone= tokens.nextToken(); 循环中的代码块不可靠。无论是因为你使用两个分隔符而只是在一个分隔符上进行标记,或者是因为某些while有6个令牌,最终结果是你的算法一直假设有5个令牌的倍数,但实际上它是5,6和9的某种组合,最终不是5的干净倍数。

我还有几个问题(也许最好对你原来的帖子发表评论)。只是值得深思。

  1. 为什么你不能使用其他任何contactLines s?
  2. 为什么使用静态方法而不是类方法(例如String)?