如何同时对数字和名称进行排序

时间:2016-11-08 16:50:15

标签: java

目前,我正处于我只对文件中的名称进行排序的地步,但我也希望它能够使年龄可以排序。另一个问题是尝试获取相同但具有不同年龄的名称进行排序。现在我的代码看起来像这样:

import java.io.BufferedReader;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;


public class MultiKey {

    public static void main(String[] args) {
        File textFile = new File("H:\\Names_ages.txt");
        FileReader in;
        BufferedReader readFile;
        String lineOfText;

        try {
            in = new FileReader(textFile);
            readFile = new BufferedReader(in);
            BufferedReader reader = new BufferedReader(new FileReader(textFile));
            List<String> results = new ArrayList<String>();
            while ((lineOfText = readFile.readLine()) != null) {
                results.add(lineOfText);

            }
            Collections.sort(results);
            System.out.println(results);


            readFile.close();
            in.close();
        } catch (FileNotFoundException e){
            System.out.println("File does not exist or could not be found");
            System.err.println("FileNotFoundException: "+ e.getMessage());
        } catch (IOException e){
            System.out.println("Problem reading file");
            System.err.println("IOException: " + e.getMessage());
        }
    }
}

3 个答案:

答案 0 :(得分:1)

逻辑:

  • 为要进行排序的属性创建单独的持有者。
  • 在该Person对象上应用Comparator。

    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.io.IOException;
    import java.lang.reflect.Array;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.Collections;
    import java.util.List;
    
    
    public class MultiKey {
    
        public static void main(String[] args) {
            File textFile = new File("H:\\Names_ages.txt");
            FileReader in;
            BufferedReader readFile;
            String lineOfText;
    
            try {
                in = new FileReader(textFile);
                readFile = new BufferedReader(in);
                BufferedReader reader = new BufferedReader(new FileReader(textFile));
                List<Person> results = new ArrayList<Person>();
                while ((lineOfText = readFile.readLine()) != null) {
                    //split here the line into name and age separate variables basedon delimiter available between them.
                    Person p = new Person(name,age);
                    results.add(p);
    
                }
                order(results);
                System.out.println(results);
    
    
                readFile.close();
                in.close();
            } catch (FileNotFoundException e){
                System.out.println("File does not exist or could not be found");
                System.err.println("FileNotFoundException: "+ e.getMessage());
            } catch (IOException e){
                System.out.println("Problem reading file");
                System.err.println("IOException: " + e.getMessage());
            }
        }
    }
    
    private static void order(List<Person> persons) {
    
        Collections.sort(persons, new Comparator<Person>() {
    
            public int compare(Object o1, Object o2) {
    
                String x1 = ((Person) o1).getName();
                String x2 = ((Person) o2).getName();
                int sComp = x1.compareTo(x2);
    
                if (sComp != 0) {
                   return sComp;
                } else {
                   Integer x1 = ((Person) o1).getAge();
                   Integer x2 = ((Person) o2).getAge();
                   return x1.compareTo(x2);
                }
        }});
    }
    
    public class Person{
    private String name;
    private int age;
    
    public String getName(){
    return this.name;
    }
    
    public void setName(String name){
    this.name = name;
    }
    
    public int getAge(){
    return this.age;
    }
    
    public vois setAge(int age){
    this.age = age;
    }
    

    }

答案 1 :(得分:0)

典型的方法是:

  • 解析每一行并为其创建封装对象 (在您的示例中为“Person”类,其中包含“name”和“age”两个字段) 如何进行此分析取决于文件中行的格式 例如你可以使用String.split(“,”),如果是行中的值 用逗号分隔。

  • 将封装对象添加到列表中,然后例如排序使用 比较者。使用java.util.Collections.sort(Comparator)。

当然,使用该封装对象列表,您可以更轻松地完成更多操作,例如:找到名字相同但年龄不同的人。

答案 2 :(得分:0)

您可以使用Comparator链接 Comparator<String> byName = Comparator.comparing(s -> s.split(" ")[0]); Comparator<String> byAge = Comparator.comparingInt(s -> Integer.parseInt(s.split(" ")[1])); try (BufferedReader br = new BufferedReader(new FileReader("filePath"))) { List<String> sorted = br.lines().sorted(byName.thenComparing(byAge)).collect(Collectors.toList()); return sorted; } catch (IOException e) { e.printStackTrace(); } s

\\s+

如果预期还有多个空格,请尝试使用模式Comparator而不是空格

或者我们可以创建一个Comparator,而不是创建两个 Comparator<String> c = Comparator.<String, String> comparing(s -> s.split("\\s+")[0]) .thenComparingInt(s -> Integer.parseInt(s.split("\\s+")[1])); s

strstr