2014-07-02 177 views
0

我正在编写一个Java应用程序,该应用程序应该读取包含每行记录的输入文件,并用逗号分隔这些字段。应用程序的输出应该在标准输出格式如下:按对象排序对象的ArrayList属性并组织它们

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

等等....

我创建了一个Person类来保存数据,并实现与接口的compareTo可比接口对年龄进行初步分类并对性别进行二级分类。我可以稍后在名称上添加三级排序。

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类中,我创建了Person的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); 

    } 
} 
+0

“所需的格式”到底是什么?什么样的格式? –

+0

欢迎来到SO。你试图解决这个问题的尝试是什么? – Daniel

+0

看起来好像你想通过操作来执行一个n维组,在你的例子中,n = 2。番石榴可以帮你做到这一点,或者你可以自己做。 –

回答

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