2013-11-10 8 views
0

У меня есть txt-файл, который я помещаю в массив. Данные в файле txt содержат данные в формате:Сортировка Arraylist Java

Order #  Date  Name  City  State Zip Code Transaction Amount 

по строке с каждым элементом, представляющим столбец.

Тогда есть еще 1000 строк, на которых они заполнены ответами. Я хотел бы отсортировать сумму транзакции.

Вот мой код:

import java.io.FileNotFoundException; 
import java.io.FileReader; 
import java.util.ArrayList; 
import java.util.Random; 
import java.util.Scanner; 

public class Rewards { 

public static void main(String[] args) throws FileNotFoundException { 

    String fileName = ("test.txt"); 
    FileReader fin = new FileReader("C:/Users/Jordan/Desktop/Project5Text.txt"); 
    Scanner src = new Scanner(fin); 
    ArrayList<String> lines = new ArrayList<String>(); 
    src.useDelimiter(":"); 

    Random rand = new Random(); 

    while (src.hasNext()) { 
     String l = src.nextLine(); 
     if (!l.equals("")) 
      lines.add(l); 
    } 
    String[] randomChoices = new String[1]; // Number of random choices 

    for (int i = 0; i < randomChoices.length; i++) { 
     String randomString = lines.get(1 + rand.nextInt(lines.size() - 1)); 
     randomChoices[i] = randomString; 
    } 

    for (String s : randomChoices) 
     System.out.println("Random Winner for $20 gift card is:  " +s); 

    String[] randomChoices1 = new String[1]; // Number of random choices 

    for (int i = 0; i < randomChoices1.length; i++) { 
     String randomString = lines.get(1 + rand.nextInt(lines.size() - 1)); 
     randomChoices1[i] = randomString; 
    } 

    for (String s : randomChoices1) 
     System.out.println("Random Winner for $40 gift card is:  " +s); 

    String[] randomChoices2 = new String[1]; // Number of random choices 

    for (int i = 0; i < randomChoices2.length; i++) { 
     String randomString = lines.get(1 + rand.nextInt(lines.size() - 1)); 
     randomChoices2[i] = randomString; 
    } 

    for (String s : randomChoices2) 
     System.out.println("Random Winner for $60 gift card is:  " +s); 

    String[] randomChoices3 = new String[1]; // Number of random choices 

    for (int i = 0; i < randomChoices3.length; i++) { 
     String randomString = lines.get(1 + rand.nextInt(lines.size() - 1)); 
     randomChoices3[i] = randomString; 
    } 

    for (String s : randomChoices3) 
     System.out.println("Random Winner for $80 gift card is:  " +s); 

    String[] randomChoices4 = new String[1]; // Number of random choices 

    for (int i = 0; i < randomChoices4.length; i++) { 
     String randomString = lines.get(1 + rand.nextInt(lines.size() - 1)); 
     randomChoices4[i] = randomString; 
    } 

    for (String s : randomChoices4) 
     System.out.println("Random Winner for $100 gift card is:  " +s); 

} 
} 

Вот некоторые из текстового файла, который я использую.

Заказ # Дата Имя Отчество Фамилия Адрес Город Штат Индекс Электронная почта Сумма транзакции

1 8/26/2012 Kristina H Chung +947 Martin Ave. Muncie CA 46489 [email protected] $ 593

2 11/16/2012 Paige H Chen 15 MainWay Rd. Dallas HI 47281 [email protected] $ 516

3 11/10/2012 Шерри E Melton 808 Washington Way Бразилия CA 47880 [email protected] $ 80

4 9/20/2012 Гретхен I Hill 56 Washington Dr Атланта FL 47215 [email protected] $ 989

5 3/11/2012 Karen U Puckett 652 Maplewood Ct. Бразилия FL 46627 [email protected] $ 826

6 7/4/2012 Patrick O Song 679 MainWay Rd. Lafayette GA 47161 [email protected] $ 652

ответ

0

Один из способов сделать это - создать класс, который может представлять строку в вашем файле. В этом классе у вас будут поля для каждого столбца. Попросите этот класс реализовать интерфейс Comparable. Это заставляет вас реализовать метод compareTo().

Когда вы это сделали, вы можете просто создать ArrayList с этим классом и использовать встроенный метод sort() для его сортировки!

0

Я хотел бы предложить, что вы сначала создать класс, который хранит строку в логическом порядке:

class Transaction{ 
    String date; 
    String name; 
    String address; 
    int amount; 
    // etc... 
} 

Тогда вы можете хранить каждую транзакцию в список и написать собственный компаратор:

List<Transaction> transactions = new ArrayList<Transaction>(); 
... 
Collections.sort(transactions, new Comparator<Transaction>(){ 
    public int compare(Transaction t1, Transaction t2){ 
     return Double.compare(t1.amount, t2.amount); 
    } 
}); 
0

Если вам нужно простое (но не максимально эффективное) решение, вы можете сделать:

lines.sort(new Comparator<String>() { 

     public double dollar(String line) { 
      String[] parts = line.split(" "); 
      // take the last element and remove its first character ($) 
      return Double.parseDouble(parts[parts.length - 1].substring(1)); 
     } 
     @Override 
     public int compare(String o1, String o2) { 
      // swap o1 and o2 if you need to sort in the opposite order 
      return Double.compare(dollar(o1), dollar(o2)); 
     } 
    }); 
Смежные вопросы