Java 如何按字母顺序排列通讯簿中的联系人?
有人能帮我吗? 我有一个方法,作为管理联系人簿的更大项目的一部分 我需要使用Java 如何按字母顺序排列通讯簿中的联系人?,java,Java,有人能帮我吗? 我有一个方法,作为管理联系人簿的更大项目的一部分 我需要使用字符串,因此没有数组。 如果可能的话,我想使用compareTo 说明如下: 此方法插入一条接触线(接触线示例: 6 |科里|本|benben@hotmail.com|4502334565)在给定的笔记本中。联络线需要按姓氏的字母顺序排列 此方法不验证副本 参数书我们要介绍接触线的书(来自参数) 我们假设这本书是非空的,但从一开始就是空的 如果非空,则按以下方式形成: /* 3|Crevier|Simon|
字符串
,因此没有数组。
如果可能的话,我想使用compareTo
说明如下:
此方法插入一条接触线(接触线示例:
6 |科里|本|benben@hotmail.com|4502334565)在给定的笔记本中。联络线需要按姓氏的字母顺序排列
此方法不验证副本
参数书我们要介绍接触线的书(来自参数)
我们假设这本书是非空的,但从一开始就是空的
如果非空,则按以下方式形成:
/*
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需要在书中添加的一行上格式化的触点
我们假设接触线为非空、非空且格式良好(如示例中所示)
插入后新书的新字符串。这本新归还的书需要精心编排
此方法需要使用另一个方法:来自同一类的findLastNameContact()(方法从联系人行中获取姓氏,例如第3行| Crevier | Simon|simon@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;
}
这是家庭作业吗?如果是,你应该让我们知道 首先,在我看来,您在
一书中使用了两种不同的分隔符:
分隔符,用于分隔每个联系人线路中的数据字段,和\n
新行分隔符,用于分隔书籍中的各个联系人行
请参阅代码的这一部分:
while (tokens.hasMoreTokens()){
id = tokens.nextToken();
lastName = tokens.nextToken();
givenName = tokens.nextToken();
email= tokens.nextToken();
phone= tokens.nextToken();
if(lastName.compareTignoreCase(lastName联系人)>0){
newBook=book+contactLine+“\n”+id+“|”+lastName+“|”+givenName+“|”+email+“|”+电话+“\n”;
}
因此,在|
上划界的StringTokenizer
将解析书籍
,就像它的格式是这样的:
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
请注意,两条联络线之间缺少|分隔符。因此,它将book
标记为10个标记,将45987654237
视为1个标记,而不是2个单独的标记,4598765423
和7
,而不是StringTokenizer
识别5+6=11个标记
第二个,您上面粘贴的输出中的联系人线路
条目还有另一个问题。在我上面引用的例子中,有“ZHE Xang”和“morier Dominic”,这两行包含不同的标记。ZHE Xang的contactLine
包含5个令牌,而morier Dominic的包含6个令牌。因此,上面的while
循环无法可靠工作-它希望所有联系人线路都有5个令牌,但有些显然有6个令牌
我引用了您代码的这一部分:
while (tokens.hasMoreTokens()){
id = tokens.nextToken();
lastName = tokens.nextToken();
givenName = tokens.nextToken();
email= tokens.nextToken();
phone= tokens.nextToken();
我认为这两个问题的最终结果实际上是同一个问题:它使得中的代码块不可靠,而循环不可靠。无论是因为您使用了两个分隔符,但仅在一个分隔符上标记,还是因为某些联系人线路有6个标记,最终结果是您的算法始终假设5个标记的倍数,但实际上,5、6和9的组合并不是5的干净倍数
我还有几个问题要问你(也许这最好放在你原来帖子的评论里)。值得思考
为什么不能使用任何其他String
s
为什么要使用静态方法而不是类方法(例如book.insertContact(contact);
)
对不起,用法语提问比较容易。我不知道这些问题只用英语回答。我需要按字母顺序排列笔记本中的联系人。是的,你说得对,这只是家庭作业的一小部分,但我不知道该怎么做。我看到了问题,但我能解决。我想使用字符串,因为我已经学会了使用它们。我会用更小的方法来完成更大的项目。这种方法就是其中之一。正如您所注意到的,这个方法调用另一个方法:findLastNameContact(contactLine)->它从联系人线路中提取姓氏。Thx供您参考。如果您可以使用更适合任务的不同数据结构,例如a或a,这将更加容易。这将避免我指出的第一个问题(使用\n
来划分不同的接触线),并且可能会更快。你还有别的问题吗?我的回答对你有帮助吗?很遗憾,我不能在这个项目中使用数组或向量。我必须用我迄今为止所掌握的知识来解决这个问题。你帮我看问题出在哪里。另外一个问题我现在还没有,所以非常感谢你的帮助。我很感激。非常欢迎你@NataliaAndronic。如果我的答案有帮助,请随时将其标记为已接受的答案,并投票支持!希望你剩下的作业顺利进行。请告诉我怎么做,因为我是这个网站的新手。谢谢!