java - 按对象属性对对象的 ArrayList 进行排序并组织它们

标签 java sorting arraylist

我正在编写一个Java应用程序,它应该读取一个输入文件,每行都有记录,并且字段以逗号分隔。应用程序的输出应在标准输出上,格式如下:

Age1
  Sex1
    name1
    name2
  Sex2
    name3
    name4
e.g
33
  Female
    Jayanta
    Kanupriya
44
  Female
    Lajjo
    Rajjo
  Male
    Raghav
    Sitaram

等等......

我创建了一个 Person 类来保存数据,并实现了 Comparable 接口(interface),其中的compareTo 接口(interface)对年龄进行初级排序,对性别进行二级排序。我可以稍后对名称添加三级排序。

public class Person implements Comparable<Person>{

    private String name;
    private int age;
    private String sex;

    /**
     * @param age, sex and name
     */
    public Person(String name, int age, String sex) {
        this.setName(name);
        this.setAge(age);
        this.setSex(sex);

    }

  //getters and setters

    @Override
    public int compareTo(Person person) {
        return this.age < person.getAge()?-1:this.age > person.getAge()?1:sortOnGender(person);
    }

     public int sortOnGender(Person person) {
        if (this.sex.compareToIgnoreCase(person.getSex()) < 0) {
            return -1;
        }
        else if (this.sex.compareToIgnoreCase(person.getSex()) > 0) {
            return 1;
        }
        else {
            return 0;
        }
    }

     @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append(String.valueOf(this.age)).append('-').append(this.sex).append('-').append(this.name);
        return sb.toString();
    }
}

接下来,在 App 类的 main 方法中,我创建了 Persons 的 ArrayList 并填充了数据并使用 Collections.sort() 进行排序。我打印了 ArrayList 并按排序顺序排列。然而问题是如何获取所需格式的数据。

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.StringTokenizer;

public class App {

    //An array of persons
    private static List<Person> persons = new ArrayList<Person>();

    public static void main(String[] args) {

        File inputfile = new File(args[0]);

        if(inputfile.exists()) {
            String line;
            BufferedReader br;
            StringTokenizer st = null;
            try {
                br = new BufferedReader(new FileReader(inputfile));
                // Read comma seperated file line by line
                while((line = br.readLine()) != null) {

                    //Break the line using "," as field seperator
                    st = new StringTokenizer(line, ",");

                    // Number of columns in the line
                    int numcols = st.countTokens();

                    if(numcols > 0) {
                        String[] cols = new String[st.countTokens()];

                        // Till the time columns are there in the line
                        while(st.hasMoreTokens()) {
                            for(int i=0; i < numcols; i++) {
                                cols[i] = st.nextToken();
                            }
                        }

                        // If there are elements in the cols array
                        if(cols.length !=0) {
                            // Create a list of persons
                            persons.add(new Person(cols[0].trim(), Integer.parseInt(cols[1].toString().trim()), cols[2].trim()));
                        }
                    }
                    else {
                        // Print error and continue to next record (Takes care of blank lines)
                        System.err.println("Error: No columns found in line");
                    }
                }
                // Sort the Collection
                Collections.sort(persons);
                br.close();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
            catch (IOException e) {
                e.printStackTrace();
            }

        }
        else {
            System.out.println("Specify the location of the input file");
        }

        System.out.println(persons);

    }
}

最佳答案

我不确定我是否明白你的意思,但你只需要编写一个可以按你想要的方式显示的方法!

如果您想在控制台中打印,您可以尝试以下操作:

Public printListPersons(persons[] p){
   for(Person p : persons){
       System.out.println(p[i].getAge);
       System.out.println("\n");
       System.out.println("\t" + p[i].getSex);
       ....
   }
}

关于java - 按对象属性对对象的 ArrayList 进行排序并组织它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24534142/

相关文章:

java - 保存在 ArrayLists 中,但错误的输出写入文件

java - Hibernate 和 PostgreSQL 中具有 UserType 的数组 --> MappingException

php - 搜索时高级 ORDER BY

string - 等长字符串的排序算法 C++

ruby-on-rails - 使用 acts-as-taggable-on gem 通过关联排序

powershell - 如何在Powershell中导出具有arraylist的对象

arrays - 设置固定大小的ArrayList

java - 从 eclipse 导出 jar 不起作用

java - 如何在 Java 中将文件路径列表转换为 JSON 对象

java - 从 Spring Data JPA 1.4 升级到 1.8 后,如何解决自定义 JpaRepositoryFactory 中的编译错误?