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

时间:2014-07-02 14:43:21

标签: java sorting arraylist

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

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

依旧......

我创建了一个Person类来保存数据,并使用compareTo接口实现Comparable接口,对age进行主要排序,对Sex进行二次排序。我可以稍后在名字上添加三级排序。

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

接下来在main方法的App类中,我创建了一个PersonList的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);

    }
}

2 个答案:

答案 0 :(得分:1)

我不确定我是否会关注您,但您只需要编写一个可以显示的方法!

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

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

答案 1 :(得分:0)

一旦你有一个排序列表,你应该可以做这样的事情

int currentAge = -1;
String currentSex = null;

for (Person person : persons) {
    if (person.getAge() != currentAge) {
        currentAge = person.getAge();
        currentSex = null;
        System.out.println(person.getAge());
    }
    if (!person.getSex().equals(currentSex)) {
        currentSex = person.getSex();
        System.out.println("\t" + person.getSex());
    }

    System.out.println("\t\t" + person.getName());
}