簡體   English   中英

使用Java集合框架對文本文件中的兩列進行排序

[英]sort two columns in a text file by using java collections framework

我有一個包含以下行的輸入文件

 21,mahesh 12,suresh 23,rajesh 25,lokesh 

通過使用ArrayList我編寫了下面的代碼來處理升序和降序

import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;

public class FileRead {
    public static void main(String[] args)throws IOException {
        Scanner s = new Scanner(new FileReader("D:\\Numbers.txt"));
        ArrayList<String> al = new ArrayList<String>();

        while (s.hasNextLine()) {
            String line = s.nextLine(); 
            al.add(line);
        }
        Collections.sort(al,Collections.reverseOrder());

        for (String i: al)
        System.out.println(i);
    }
}

這產生了以下輸出

  - 25,lokesh - 23,rajesh - 21,mahesh - 12,suresh 

$在上面的代碼中,當我使用Collections.sort()操作將整行作為一行時,它可以工作。

$如果我像下面那樣先輸入字符串列,然后輸入整數列,則上面的代碼無法正常工作,它將使用字符串值按字母順序分配,我想僅使用整數而不是字符串值來對數據進行排序,請幫助我的朋友

 - mahesh,21
 - suresh,12
 - rajesh,23
 - lokesh,25

首先閱讀文件,將其存儲在地圖中

Map map = new TreeMap();
while(true)
{
 String line = bufferedReader.readLine();
 if(line == null)
 break;
 else {
   String arr[] = line.split(",");
   for(int i=0;i<arr.length-1;i++)
   {
       map.put(arr[i],arr[i+1]);
   }}
}

使用比較器對其進行排序

List list = new LinkedList(map.entrySet());
Collections.sort(list, new Comparator() {
public int compare(Object o1, Object o2) {
  return ((Comparable) ((Map.Entry) (o2)).getValue())
                        .compareTo(((Map.Entry) (o1)).getValue());
   }
});

最后展示結果

Map result = new LinkedHashMap();
for (Iterator it = list.iterator(); it.hasNext();) {
    Map.Entry entry = (Map.Entry)it.next();
    result.put(entry.getKey(), entry.getValue());
}
System.out.println(result.toString());

從比較器返回時用於增加開關o1和o2。

對於第二種輸入

    List list = new LinkedList(map.keySet());
    Collections.sort(list);
    Set set = map.entrySet();
    Map result = new LinkedHashMap();
    for (Iterator it = set.iterator(); it.hasNext();) {
        Map.Entry entry = (Map.Entry)it.next();
        result.put(entry.getKey(), entry.getValue());
    }
    System.out.println(result.toString());

下面將允許您使用LineEntry類將信息解析為適當的類型,以包裝數據。 它將提供對Integer值的正確排序,而不是將它們視為String並應用字母順序。

import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;

public class FileRead {

    public static void main(String[] args) throws Exception {
        Scanner s = new Scanner(new InputStreamReader(FileRead.class.getResourceAsStream("/numbers.txt")));
        s.useDelimiter("[,\\s]");

        ArrayList<LineEntry> lineEntryList = new ArrayList<LineEntry>();
        while (s.hasNextLine()) {
            int amount = s.nextInt();
            String value = s.next();
            LineEntry lineEntry = new LineEntry(value, amount);
            lineEntryList.add(lineEntry);
        }
        Collections.sort(lineEntryList, Collections.reverseOrder());

        for (LineEntry i : lineEntryList) {
            System.out.println(i);
        }

    }

    public static class LineEntry implements Comparable<LineEntry>{

        private String value;
        private Integer amount;

        public LineEntry(String value, Integer amount) {
            this.value = value;
            this.amount = amount;
        }

        public String getValue() {
            return value;
        }

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

        public Integer getAmount() {
            return amount;
        }

        public void setAmount(Integer amount) {
            this.amount = amount;
        }

        @Override
        public String toString() {
            return "LineEntry{" + "value=" + value + ", amount=" + amount + '}';
        }

        @Override
        public int compareTo(LineEntry o) {
            int compareTo = o.getAmount().compareTo(amount);
            if (compareTo == 0) {
                compareTo = o.getValue().compareTo(value);
            }
            return compareTo;
        }

}

最好創建一個不同的類,該類在每行中包含用逗號分隔的數據作為該類的變量,以便將來在同一行中有多個列數據的情況下,代碼可以伸縮,並且還可以基於您的用戶創建自定義比較器排序條件:

public class FileRead {

    public static void main(String[] args) throws Exception {
        Scanner s = new Scanner(new FileReader("E:\\Numbers.txt"));        
        List<FileObject> al = new ArrayList<FileObject>();
        while (s.hasNextLine()) {
            String line = s.nextLine();            
            al.add(new FileObject().createFileObject(line));
        }
        Collections.sort(al,new FileObjectComparator());

        for (FileObject i: al)
            System.out.println(i);

    }

}

class FileObject {

    private int id;
    private String name;

    public FileObject createFileObject(String line) {
        if(line != null && !line.isEmpty()) {
            for(String str : line.split(",")) {
                str = str.trim();
                if(str.matches("([\\d]*)")) {
                    id = Integer.valueOf(str);
                } else {
                    name = str;
                }
            }
        }
        return this;
    }

    ... // getters and setters
    @Override
    public String toString() {      
        return "[ID] "+id+ " [Name] "+name ;
    }
}

class FileObjectComparator implements Comparator<FileObject> {

    @Override
    public int compare(FileObject o1, FileObject o2) {      
        return o2.getId() - o1.getId();
    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM