我正在学习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);
}
}
答案 0 :(得分:1)
我不确定您对代码究竟是什么困扰,但这就是您提供的代码似乎在做什么:
1)它读取文本文件的行,并将它们组织为字符串列表,保留它们的顺序(据说,因为我们没有看到TextFileUtils.readTextFile(..)是如何实际实现的)。 p>
2)按升序名称顺序对列表进行排序。假设每一行由逗号分隔的一系列单词组成,其中第一个单词是第一个名称,第二个单词是姓氏。主要顺序是名字,次要顺序是姓氏。 String.Split()的用法是FirstNameComparator实现的一部分。
3)在排序后将原始行写回不同的文本文件。
关于比较器的说明:
Comparator定义了一种比较两个项目的机制。实施该机制后,您可以将其用于订购事项(排序,查找最大/最小,搜索树,优先级队列等)的各种用途。你对步骤的解释并不准确;代码不会将文件读入列表,执行拆分,然后排序。拆分实际上是排序的一部分。排序算法多次调用比较器,直到确定排序完成为止。此外,它现在的实现方式可能会多次拆分相同的行,以便将它与不同的行进行比较(效率不高,但我想这不是重点)。
另外两条评论
关于解析行的方式:当前代码只处理逗号。它不会删除空格。您可以使用更复杂的正则表达式来处理其他类型的分隔符和空格。
我在代码中没有看到任何删除重复的内容
答案 1 :(得分:0)
Comparator
只是确定两个项目的相对顺序的一种方式,仅此而已。当您想要控制对象集合的排序顺序时,您可以使用它,但在这种情况下,它听起来像是在尝试改变比较器中的对象;这不会起作用。
你是对的,trim()
方法将摆脱前导和尾随空格(取决于它自己的空格定义,这对于像你这样的简单用例来说很好)。你需要早点使用它;当然,在您提取“原始”数据之后,但在将数据添加到列表之前。
除此之外,你还没有真正说出要求是什么。我可以假设您需要丢弃尾随空格,但是逗号呢?这些是否应该被解释为元素分隔符,在功能上等同于换行符?还是需要其他东西?
我认为你一般都走在正确的轨道上;只需考虑所需的步骤,并尝试单独执行每个步骤,因为它更干净。据我所知,你的步骤可能是这样的: