2016-03-29 72 views
-2

任何人都可以幫我嗎? 我有一個方法作爲管理聯繫簿的大型項目的一部分。我需要使用String,所以沒有數組。如果可能,我想使用compareTo如何按字母順序排列通訊錄中的聯繫人?

的描述是:在給定的筆記本:

此方法插入一個接觸線

6|cori|ben|[email protected]|4502334565的接觸線的爲例)。聯繫線需要按姓氏的字母順序排列。

此方法不驗證dublicates。

參數本書,我們要介紹的接觸線(從參數)的書

我們假設非空的書,而是從開始空。

如果非空,它是這樣形成的:

/* 
     3|Crevier|Simon|[email protected]|5145678988 (contact line) 
     1|Douglas|Sylvie|nothing|4507461234 
     2|Dumoulin|Fred|[email protected]|nothing 
     4|Girard|Myriam|nothing|nothing 

*/ 

參數contactLine接觸到一個行巫格式化需要加入書

我們假設接觸線非空,非空和格式正確(如例)

插入後新書的新字符串。新的歸還書需要格式正確。

此方法需要使用另一種方法:findLastNameContact()來自同一個類(方法是從聯繫線的前一行獲取姓氏:3 | Crevier |Simon |[email protected] | 5145678988)=> Crevier是這個姓氏。

我們需要忽略這種情況。

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

METHOD IF CONTACT IS INSERTED IN THE BOOK 
---------------------------------------------- 
Insert 1|crook|hubert|[email protected]|4502765009 in the empty book... ERROR 

Expected: 
1|crook|hubert|[email protected]|4502765009 

Have found: 



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

Expected: 

2|Aubre|Camille|aucun|5149098778 

1|crook|hubert|[email protected]|4502765009 

Have found: 

1|crook|hubert|[email protected]|45027650092|aubre|Camille|aucun|5149098778 

1|crook|hubert|[email protected]|4502765009 

Instert 3|charland|Marc|[email protected]|nothing... ERROR - 
NoSuchElementException unexpected. 

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

Insert 5|fortin|Bruno|[email protected]|5142768898... ERROR - NoSuchElementException unexpected. 

Insert 6|ZHE|Xang|[email protected]|4598765423... ERROR - NoSuchElementException unexpected. 

Insert 7|morier|Dominic|[email protected]|4598765423... ERROR 

Expected: 

    2|Aubre|Camille|aucun|5149098778 

    3|CHaRland|Marc|[email protected]|aucun 

    1|crook|hubert|[email protected]|4502765009 

    5|Fortin|Bruno|[email protected]|5142768898 

    4|Mason|Isabelle|aucun|aucun 

    7|Morier|Dominic|[email protected]|4598765423 

    6|ZHE|Xang|[email protected]|4598765423 

    Have found : 

    2|Aubre|Camille|nothing|5149098778 

    3|CHaRland|Marc|[email protected]|nothing 

    1|crook|hubert|[email protected]|4502765009 

    5|Fortin|Bruno|[email protected]|5142768898 

    4|Mason|Isabelle|nothing|nothing 
    6|ZHE|Xang|[email protected]|45987654237|morier|Dominic|[email protected]|4598765423 
    nothing 

    6|ZHE|Xang|[email protected]|4598765423 


Insertion 8|alban|Roger|[email protected]|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|[email protected]|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; 
    } 
+0

對不起,用法語提問比較容易。我不知道這些問題只用英文解決。我需要按字母順序排列筆記本中的聯繫人。 –

回答

0

這功課嗎?如果是這樣,你應該讓我們知道。

首先,在我看來,您使用的是兩種不同的分隔符的內部book:在|分隔符,每個contactLine中分隔數據字段,以及您所使用的分隔各個contactLine S中\n換行分隔符在book之內。

請參閱此部分代碼:

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

正因爲如此,你StringTokenizer,這是在|界定,將解析book,如果它是格式如下:

6|ZHE|Xang|[email protected]|45987654237|morier|Dominic|[email protected]|459876542|nothing 

當實際上兩條接觸線應該是:

6|ZHE|Xang|[email protected]|4598765423 
7|morier|Dominic|[email protected]|459876542|nothing 

請注意,兩個contactLines之間缺少|分隔符。因此,代替識別5 + 6 = 11令牌的StringTokenizer,它會將book標記爲10個令牌,將45987654237視爲1令牌而不是2個獨立令牌,45987654237

第二個,上面粘貼的輸出中的contactLine條目存在另一個問題。在我剛剛引用的例子中,「ZHX Xang」和「morier Dominic」這兩行包含不同的標記。 ZHE萬象的contactLine包含5個標記,而morier Dominic的包含6正因爲如此,你while以上循環將無法可靠地工作 - 它期待所有contactLines有5個標記,但有些顯然有6

我引用這部分你的代碼:

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

我認爲這兩個問題的最終結果實際上是同一個問題:它使你的內循環while不可靠的代碼塊。無論是因爲您使用兩個分隔符,而只是一個分隔符,還是因爲某些contactLines有6個令牌,最終結果是您的算法始終假設有5個令牌的倍數,但實際上它是一些組合5,6和9,結果不是5的乾淨倍數。

我還有一些更多的問題給你(也許這更好地把你的原帖發表評論)。只是思考的食物。

  1. 爲什麼你不能使用其他的那個String s?
  2. 爲什麼使用靜態方法而不是類方法(例如book.insertContact(contact);)?
+0

是的,你說得對只是作業的一小部分,但我無法弄清楚該做什麼。我看到了問題,但我可以修復它。我想使用字符串,因爲我已經學會了他們。我製作更小的方法,我將用於大型項目。這種方法就是其中之一。正如你注意到這個方法調用另一個方法:findLastNameContact(contactLine) - >從聯繫線中提取姓氏。 Thx爲您的意見。 –

+0

如果您可以使用更適合該任務的不同數據結構,例如[Vector](https://docs.oracle.com/javase/7/docs/api/java/ util/Vector.html)或[ArrayList](https://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html)。這將避免我指出的第一個問題(使用'\ n'分隔不同的'contactLines'),並且可能會更快。你有另外一個問題嗎?我的回答對你有幫助嗎? – Zkoh

+0

不幸的是,這個項目不能使用數組或矢量。我必須用迄今爲止的知識來解決問題。你幫我看看問題在哪裏。另一個問題現在我沒有,所以非常感謝你的幫助。我很感激。 –