【问题标题】:Getting rid of comma, whitespace, sorting in Java在 Java 中摆脱逗号、空格、排序
【发布时间】:2010-07-18 17:00:46
【问题描述】:

我正在为一个类学习 Java 中的文本处理,类中的示例是从文件中读取数据,进行文本处理,将数据(列表)写回文件。我理解这个示例,因为他将每一行读入一个字符串并将该行添加到列表中,然后使用 .split(" ") 和 Collections.sort 对返回其中一个字符串的数据进行排序。但是,如果有逗号和额外的空格,我不知道如何格式化它们。我阅读了正则表达式,但不确定是否需要这样做,因为我们还没有涉及到它并且正在使用 trim() 方法。但是,如果我将 trim() 方法放在实现 Comparator 并传递给 Collections.sort 的类的 compare 方法中,则它不会传递正确格式的字符串,因为 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); 
       } 
    } 

【问题讨论】:

  • 与其用文字描述你的代码,不如直接展示给我们。另外,如果我们不知道作业是什么,我们如何帮助完成作业?
  • 感谢这次的sn-p,你能用语言总结一下工作流程吗?您是否想说: 1. 从文件中读取。 2. 处理文本 - 即对它们进行排序(排序依据?) 3. 写回文件。 (写什么?)
  • // here is what the line below does这样的评论代码将对您和其他人有很大帮助。

标签: java


【解决方案1】:

我不确定代码到底是什么让您感到困扰,但您提供的代码似乎是这样做的:

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

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

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

关于比较器的说明:

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

还有两个 cmets

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

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

【讨论】:

    【解决方案2】:

    Comparator 只是一种确定两个项目相对顺序的方法,仅此而已。当你想控制对象集合的排序顺序时,你会使用它,但在这种情况下,听起来你正试图改变比较器中的对象;这是行不通的。

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

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

    我认为您总体上走在正确的轨道上;只需考虑所需的步骤并尝试单独执行每个步骤,因为这样更清洁。据我所知,您的步骤可能类似于:

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

    【讨论】:

    • 我不同意上面介绍的比较器会改变被比较的项目。字符串不能被改变,比较器也不会修改数组。另外,“trim() 方法将摆脱前导和尾随空格”是什么意思?如果像上面那样使用 str.split(",") ,则不会发生这种情况。您必须使用正则表达式参数明确地做到这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-04
    • 1970-01-01
    • 2020-06-22
    • 2012-12-16
    • 1970-01-01
    • 2014-02-08
    相关资源
    最近更新 更多