如何从文本文件中排序并写入另一个文本文件Java

时间:2016-07-24 11:27:38

标签: java sorting text-files

我有这个文本文件,我喜欢根据HC和P3对中的HC进行排序

这是我要分类的文件(avgGen.txt):

7686.88,HC
20169.22,P3
7820.86,HC
19686.34,P3
6805.62,HC
17933.10,P3

然后我想要的输出到新的文本文件(output.txt)是:

 6805.62,HC
17933.10,P3  
7686.88,HC
20169.22,P3  
7820.86,HC
19686.34,P3

如何从文本文件中对HC和P3进行排序,其中HC总是出现在奇数编号索引中,而P3出现在偶数编号的索引中,但我希望排序根据HC值升序?

这是我的代码:

public class SortTest {
 public static void main (String[] args) throws IOException{
    ArrayList<Double> rows = new ArrayList<Double>();
    ArrayList<String> convertString = new ArrayList<String>(); 
    BufferedReader reader = new BufferedReader(new FileReader("avgGen.txt"));

    String s;
    while((s = reader.readLine())!=null){
        String[] data = s.split(",");
        double avg = Double.parseDouble(data[0]);
        rows.add(avg);
    }

    Collections.sort(rows);

    for (Double toStr : rows){
        convertString.add(String.valueOf(toStr));
    }

    FileWriter writer = new FileWriter("output.txt");
    for(String cur: convertString)
        writer.write(cur +"\n");

    reader.close();
    writer.close();

  }
}

请帮忙。

5 个答案:

答案 0 :(得分:2)

从输入文件中读取时,基本上丢弃了字符串值。您需要保留这些字符串值,并将它们与相应的双精度值相关联。

你可以

  1. 将double值和字符串值包装到类
  2. 使用该类创建列表,而不是单独使用double值
  3. 然后使用Comparator基于类的double值对列表进行排序,或者使类实现Comparable接口。
  4. 打印出double值及其关联的字符串值,这些值封装在类
  5. 以下是一个例子:

    static class Item {
        String str;
        Double value;
    
        public Item(String str, Double value) {
            this.str = str;
            this.value = value;
        }
    }
    public static void main (String[] args) throws IOException {
        ArrayList<Item> rows = new ArrayList<Item>();
        BufferedReader reader = new BufferedReader(new FileReader("avgGen.txt"));
    
        String s;
        while((s = reader.readLine())!=null){
            String[] data = s.split(",");
            double avg = Double.parseDouble(data[0]);
            rows.add(new Item(data[1], avg));
        }
    
        Collections.sort(rows, new Comparator<Item>() {
    
            public int compare(Item o1, Item o2) {
                if (o1.value < o2.value) {
                    return -1;
                } else if (o1.value > o2.value) {
                    return 1;
                }
                return 0;
            }
        });
    
        FileWriter writer = new FileWriter("output.txt");
        for(Item cur: rows)
            writer.write(cur.value + "," +  cur.str + "\n");
    
        reader.close();
        writer.close();
    }
    

答案 1 :(得分:1)

当程序从输入文件中读取行时,它会分割每一行,存储double部分,并丢弃其余部分。这是因为仅使用了data[0],而data[1]不是任何表达式的一部分。

有几种方法可以解决这个问题。一种是创建一个具有double值和整个字符串的对象数组:

class StringWithSortKey {
    public final double key;
    public final String str;
    public StringWithSortKey(String s) {
        String[] data = s.split(",");
        key = Double.parseDouble(data[0]);
        str = s;
    }
}

创建此类的对象列表sort them using a custom comparator或通过实现Comparable<StringWithSortKey>接口,并将已排序对象的str成员写入输出文件。

答案 2 :(得分:0)

在文件中定义表示定义良好/有组织/结构化数据类型的Pojo或bean:

GormInstanceApi

之后:read-&gt; sort-&gt; store:

class Pojo implements Comparable<Pojo> {
    private double value;
    private String name;

    @Override
    public String toString() {
    return "Pojo [value=" + value + ", name=" + name + "]";
    }

    public double getValue() {
    return value;
    }

    public void setValue(double value) {
    this.value = value;
    }

    public String getName() {
    return name;
    }

    public void setName(String name) {
    this.name = name;
    }

    /**
     * @param value
     * @param name
     */
    public Pojo(double value, String name) {
    this.value = value;
    this.name = name;
    }

    @Override
    public int compareTo(Pojo o) {

    return ((Double) this.value).compareTo(o.value);
    }

}

答案 3 :(得分:0)

使用,有一种简单的方法可以执行此操作。

public static void main(String[] args) throws IOException {
    List<String> lines =
    Files.lines(Paths.get("D:\\avgGen.txt"))
         .sorted((a, b) -> Integer.compare(Integer.parseInt(a.substring(0,a.indexOf('.'))), Integer.parseInt(b.substring(0,b.indexOf('.')))))
         .collect(Collectors.toList());

    Files.write(Paths.get("D:\\newFile.txt"), lines);
}

更好的是,使用方法参考

public static void main(String[] args) throws IOException {
    Files.write(Paths.get("D:\\newFile.txt"), 
                Files.lines(Paths.get("D:\\avgGen.txt"))
                     .sorted(Test::compareTheStrings)
                     .collect(Collectors.toList()));
}

public static int compareTheStrings(String a, String b) {
    return Integer.compare(Integer.parseInt(a.substring(0,a.indexOf('.'))), Integer.parseInt(b.substring(0,b.indexOf('.'))));
}

答案 4 :(得分:0)

通过使用双循环排序项目 然后只使用循环并按排序顺序对其进行comapre

     public static void main(String[] args) throws IOException {
                ArrayList<Double> rows = new ArrayList<Double>();
                ArrayList<String> convertString = new ArrayList<String>(); 
                BufferedReader reader = null;
                try {
                    reader = new BufferedReader(new FileReader("C:/Temp/AvgGen.txt"));
                } catch (FileNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

                String s;
            try {
                while((s = reader.readLine())!=null){
                    String[] data = s.split(",");
                    convertString.add(s);
                    double avg = Double.parseDouble(data[0]);
                    rows.add(avg);
                }
            } catch (NumberFormatException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            FileWriter writer = new FileWriter("C:/Temp/output.txt");;
            Collections.sort(rows);
                 for (double sorted : rows) {
                     for (String value : convertString) {
                     if(Double.parseDouble(value.split(",")[0])==sorted)
                     {

                         writer.write(value +"\n");
                     }
                }

            }