按字母顺序对文本文件中的数据进行排序-Java

按字母顺序对文本文件中的数据进行排序-Java,java,Java,我希望输出按字母顺序列出userNameGenerator。我将HashSet转换为ArrayList,因为集合无法排序,所以我将其更改为ArrayList,以便按字母顺序对列表进行排序。我使用Collections.sort按字母顺序对字符串列表进行排序,但是,输出仍然是 同样的 按字母顺序使用的代码I: List sortedList = new ArrayList(personFile); Collections.sort(sortedList); System.out.println(

我希望输出按字母顺序列出userNameGenerator。我将HashSet转换为ArrayList,因为集合无法排序,所以我将其更改为ArrayList,以便按字母顺序对列表进行排序。我使用Collections.sort按字母顺序对字符串列表进行排序,但是,输出仍然是 同样的

按字母顺序使用的代码I:

List sortedList = new ArrayList(personFile);
Collections.sort(sortedList); 
System.out.println();
输出:

Dompteuse -> Imran Sullivan,
Deservedness -> Eadie Jefferson,
Ostracize -> Eadie Jefferson,
Abattoir -> Angel Whitehouse,
Choreography -> Imran Sullivan,Taylor Vargas,Priya Oliver,
Goodfella -> Khalil Person,Eadie Jefferson,
Frolicwas -> Taylor Vargas,
DarknianIdeal -> Sophia Jeffery,Clyde Calderon,Taylor Vargas,Liyah Navarro,
Cremaster -> Aryan Hess,
Reliable -> Imran Sullivan,Aryan Hess,Angel Whitehouse,Priya Oliver,
Hootenany -> Clyde Calderon,
Acrimony -> Taylor Vargas,
完整代码:

import java.util.*;
import java.io.*;

public class Codes {
    public static void main(String[] args) { 
        List<Codes2> personFile = new ArrayList<>();

        try {   
            BufferedReader br = new BufferedReader(new FileReader("person-data.txt"));
            String fileRead = br.readLine();
            while (fileRead != null) {
                String[] personData = fileRead.split(":");                
                String personName = personData[0];
                String userNameGenerator = personData[1];                
                Codes2 personObj = new Codes2(personName, userNameGenerator);               
                personFile.add(personObj);
                fileRead = br.readLine();
            }
            br.close();
        }

        catch (FileNotFoundException ex) {            
            System.out.println("File not found!");
        } 

        catch (IOException ex) {             
            System.out.println("An error has occured: " + ex.getMessage());
        }

        Set<String> newStrSet = new HashSet<>();
        for(int i = 0; i < personFile.size(); i++){
            String[] regionSplit = personFile.get(i).getUserNameGenerator().split(", ");
            for(int j = 0; j < regionSplit.length; j++){
                newStrSet.add(regionSplit[j]);
            }
        }

        for (String s: newStrSet) {
            System.out.printf("%s -> ", s);
            for (Codes2 p: personFile) {
                if (p.getUserNameGenerator().contains(s)) {
                    System.out.printf("%s, ", p.getPersonName());
                }
            } 
            List sortedList = new ArrayList(personFile);
            Collections.sort(sortedList); 
            System.out.println();
        }       
    }
}
人员类别:

public class Codes2 implements Comparable<Codes2> {
    private String personName;
    private String userNameGenerator;

    public Codes2(String personName, String userNameGenerator) {
        this.personName = personName;
        this.userNameGenerator = userNameGenerator;
    }

    public String getPersonName() {
        return personName;
    }

    public String getUserNameGenerator() {
        return userNameGenerator;
    }

    @Override
    public int compareTo(Codes2 o) {
        return getUserNameGenerator().compareTo(o.getUserNameGenerator());
    }

    public int compare(Object lOCR1, Object lOCR2) {                
        return ((Codes2)lOCR1).userNameGenerator                        
                .compareTo(((Codes2)lOCR2).userNameGenerator);            
    }
}

参考:

正如@phatfingers评论的那样,树集将尊重集合中条目的自然顺序

因为Codes2已经实现了,所以您可以简单地用一个树集替换原来的HashSet,并就此结束

但是,请注意以下几点:

请注意,由集合维护的顺序无论是否为显式 提供的比较器必须与equals一致(如果需要) 正确实现Set接口。见可比比较器 对于与相等一致的精确定义。这是真的 因为Set接口是根据equals操作定义的, 但是TreeSet实例使用其 比较或比较方法,因此两个元素被认为相等 用这种方法,从集合的观点来看,是相等的。这个 即使集合的顺序不一致,集合的行为也是定义良好的 平等;它只是没有遵守集合的总合同 界面重点补充


这意味着,虽然简单地使用树集可能会自行工作,您可能仍然想考虑在CODES2类中重写等值和哈希代码,以便排序行为与等值一致。

我认为有没有理由不在任何地方打印排序的列表。TeSeSe是自然排序的。这些也被排序了吗?或者你只是按userGeneratedName和区域列出了吗?在Joe的评论的基础上,看起来你使用了一个使用HashSet但不工作的程序,并试图将其转换为ArrayList。但是您遗漏了一些细节,例如打印正确的输出。如果你没有一个很长的方法来尝试做每件事,这将更容易发现。使用更小的方法将代码分解为更小的步骤,这样更易于阅读和调试。您的排序通过用户名生成器在循环中进行。此外,您正在对Code2对象进行排序,而不是对存储在newStrSet中的用户名生成器进行排序。如果您使用Java8,那么使用流式解决方案可以使操作简单得多。