2010-07-18 13 views
1

我正在學習關於Java中的文本處理,類中的示例是從文件中讀取數據,執行文本處理,將數據(List)寫回到文件。我理解這個例子,他將每行讀入一個字符串並將該行添加到列表中,並使用.split(「」),然後使用Collections.sort對返回其中一個字符串的數據進行排序。但是,如果有逗號和多餘的空白,我不知道如何格式化這些。我讀了正則表達式,但不知道是否需要這樣做,因爲我們沒有涉及,並且正在使用trim()方法。但是,如果我將trim()方法放在實現Comparator的類的比較方法中,該方法將傳遞給Collections.sort,它將不會傳遞格式正確的字符串,因爲compare會返回一個int。所以我想我正在尋找一些通用的指導方針來幫助完成這項任務,但並沒有完全給出答案。謝謝。在Java中排除逗號,空格,排序

編輯: 賦值是按順序編寫列表,刪除重複項和額外的空白。

public class TextProcess 
    { 
     public static void main(String[] args) 
     { 
      try { 
// get data from class file 
       List<String> data = TextFileUtils.readTextFile("addressbooktest.txt"); 
// process data. Really just the same address book that looks like 
// firstName, lastName, phone, email 
// with the commas, but deleting duplicates, the extra whitespace, and sorting alphabetically 
       Collections.sort(data, FIRSTNAMECOMPARATOR); 
     // write to output file 
       TextFileUtils.writeTextFile(data, "parsedaddressbooktest.txt"); 
       } 

      catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
     private static final FirstNameComparator FIRSTNAMECOMPARATOR = new FirstNameComparator(); 
    } 

    class FirstNameComparator implements Comparator<String> 
    { 
     public int compare(String s1, String s2) 
     { 

      String[] st1 = s1.split(","); 
      String[] st2 = s2.split(","); 


      String firstName1 = st1[0].toUpperCase().trim(); 
      String lastName1 = st1[1].toUpperCase().trim(); 

      String firstName2 = st2[0].toUpperCase().trim(); 
      String lastName2 = st2[1].toUpperCase().trim(); 
      if (!(firstName1.equals(firstName2))) 
       return firstName1.compareTo(firstName2); 
      else 
       return lastName1.compareTo(lastName2); 
     } 
    } 
+0

而不是描述的話你的代碼中看到的,只是更好的展示給我們。另外,如果我們不知道這個任務是什麼,我們該如何幫助完成這項任務? – Thomas 2010-07-18 17:03:01

+0

感謝這段時間的片段,你能用文字總結工作流程嗎? 你想說的是: 1.從文件中讀取。 2.處理文本 - 即對它們進行排序(按?排序) 3.回寫到文件。 (寫什麼?) – yclian 2010-07-18 17:10:45

+1

像'//這裏是下面這行'這樣的註釋代碼將會幫助你和其他人。 – 2010-07-18 17:12:33

回答

0

A Comparator只是一種確定兩個項目的相對順序的方法,僅此而已。當你想控制一個對象集合排序的順序時,你會使用它,但在這種情況下,它聽起來像你試圖在比較器中改變對象;這是行不通的。

你是對的,trim()方法將擺脫前導和尾隨空白(受自己的空白定義,這對你的簡單用例很好)。你需要在早些時候使用它;在提取「原始」數據之後,但是在將數據添加到列表之前。

除此之外,你還沒有實際說過要求是什麼。我可以假設你需要丟棄末尾的空白,但逗號呢?這些應該被解釋爲元素分隔符,在功能上等同於換行符?或者還有其他需要的東西?

我認爲你一般在正確的軌道;只需考慮所需的步驟,並嘗試分別完成每個步驟,因爲它更清潔。從我所知道的情況來看,您的步驟可能類似於:

  1. 識別並打開流以從文件讀取數據(完成)。
  2. 使用此流來提供文件中的字符數據,一次一行(完成)。
  3. 對於每一行,刪除空格並在逗號分割。
  4. 對於每個格式化的字符串,將其添加到列表中。
  5. 按給定順序對列表進行排序。
+0

我不同意上面介紹的比較變異了正在比較的項目。字符串不能被突變,比較器也不會修改數組。此外,你的意思是「修剪()方法將擺脫前導和尾隨空白」?如果你像上面那樣使用str.split(「,」),這不會發生。你必須用正則表達式參數來明確地做到這一點。 – 2010-07-19 10:29:44

1

我不知道究竟是什麼困擾你的代碼,但這裏是你提供的代碼似乎做:

1)它讀取的文本文件的線條,並組織他們爲保留它們的順序(據說,因爲我們沒有看到TextFileUtils.readTextFile(..)是如何實際實現的)。

2)按升序名稱順序對列表進行排序。假定每一行由一系列用逗號分隔的單詞組成,其中第一個單詞是第一個名字,第二個單詞是最後一個名字。主要排序是名字,次要排序是姓氏。 String.Split()的用法是FirstNameComparator實現的一部分。

3)將排序後的原始行寫回不同的文本文件。

的注意事項有關比較:

一個Comparator定義用於比較兩個項目的機制。一旦機制實施,您可以將其用於訂購事宜(排序,尋找最大值/最小值,搜索樹,優先級隊列等)的各種用途。你對這些步驟的解釋並不準確;代碼不會將文件讀入列表,執行拆分,然後進行排序。分割實際上是分類的一部分。排序算法多次調用您的比較器,直到它確定排序完成。此外,它現在實施的方式可能會多次拆分相同的線路,以便將其與不同線路進行比較(效率不高,但我認爲這不是重點)。

兩個更多的評論

  • 關於你解析線的方式:只用逗號當前的代碼交易。它不刪除空格。您可以使用更復雜的正則表達式來處理其他類型的分隔符和空格。

  • 我沒有在代碼中任何刪除重複