2010-07-18 15 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定义用于比较两个项目的机制。一旦机制实施,您可以将其用于订购事宜(排序,寻找最大值/最小值,搜索树,优先级队列等)的各种用途。你对这些步骤的解释并不准确;代码不会将文件读入列表,执行拆分,然后进行排序。分割实际上是分类的一部分。排序算法多次调用您的比较器,直到它确定排序完成。此外,它现在实施的方式可能会多次拆分相同的线路,以便将其与不同线路进行比较(效率不高,但我认为这不是重点)。

两个更多的评论

  • 关于你解析线的方式:只用逗号当前的代码交易。它不删除空格。您可以使用更复杂的正则表达式来处理其他类型的分隔符和空格。

  • 我没有在代码中任何删除重复