摆脱逗号,空白,用Java排序

时间:2010-07-18 17:00:47

标签: java

我正在学习Java中的文本处理类,而类中的示例是从文件中读取数据,进行文本处理,将数据(List)写回文件。我理解这个例子,他将每行读入一个String并将该行添加到列表中并使用.split(“”)然后使用Collections.sort对返回其中一个字符串的数据进行排序。但是,如果有逗号和额外的空格,我不知道如何格式化。我读了正则表达式,但不确定是否需要它,因为我们没有涵盖那个并且正在使用trim()方法。但是如果我将trim()方法放在我的类的compare方法中,该方法实现了传递给Collections.sort的Comparator,那么它将不会传递正确格式化的字符串,因为compare返回一个int。所以我想我正在寻找一些通用指南来帮助完成这项任务,但不能完全放弃答案。感谢。

编辑: 分配是按顺序编写列表,删除重复项和额外的空格。

    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); 
       } 
    } 

2 个答案:

答案 0 :(得分:1)

我不确定您对代码究竟是什么困扰,但这就是您提供的代码似乎在做什么:

1)它读取文本文件的行,并将它们组织为字符串列表,保留它们的顺序(据说,因为我们没有看到TextFileUtils.readTextFile(..)是如何实际实现的)。 p>

2)按升序名称顺序对列表进行排序。假设每一行由逗号分隔的一系列单词组成,其中第一个单词是第一个名称,第二个单词是姓氏。主要顺序是名字,次要顺序是姓氏。 String.Split()的用法是FirstNameComparator实现的一部分。

3)在排序后将原始行写回不同的文本文件。

关于比较器的说明:

Comparator定义了一种比较两个项目的机制。实施该机制后,您可以将其用于订购事项(排序,查找最大/最小,搜索树,优先级队列等)的各种用途。你对步骤的解释并不准确;代码不会将文件读入列表,执行拆分,然后排序。拆分实际上是排序的一部分。排序算法多次调用比较器,直到确定排序完成为止。此外,它现在的实现方式可能会多次拆分相同的行,以便将它与不同的行进行比较(效率不高,但我想这不是重点)。

另外两条评论

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

  • 我在代码中没有看到任何删除重复的内容

答案 1 :(得分:0)

Comparator只是确定两个项目的相对顺序的一种方式,仅此而已。当您想要控制对象集合的排序顺序时,您可以使用它,但在这种情况下,它听起来像是在尝试改变比较器中的对象;这不会起作用。

你是对的,trim()方法将摆脱前导和尾随空格(取决于它自己的空格定义,这对于像你这样的简单用例来说很好)。你需要早点使用它;当然,在您提取“原始”数据之后,但在将数据添加到列表之前。

除此之外,你还没有真正说出要求是什么。我可以假设您需要丢弃尾随空格,但是逗号呢?这些是否应该被解释为元素分隔符,在功能上等同于换行符?还是需要其他东西?

我认为你一般都走在正确的轨道上;只需考虑所需的步骤,并尝试单独执行每个步骤,因为它更干净。据我所知,你的步骤可能是这样的:

  1. 识别并打开一个流以从文件中读取数据(完成)。
  2. 使用此流来提供文件中的字符数据,一次一行(完成)。
  3. 对于每一行,删除空格并用逗号分隔。
  4. 对于每个格式化的字符串,将其添加到列表中。
  5. 按给定顺序对列表进行排序。