0

初めてのユーザーなので、何か間違っていたらごめんなさい。

ユーザーの入力内容に応じて配列をソートするプログラムを作成する必要があります。データはファイルから読み取られます。ファイルBank.txtには10,000 個のアカウントが含まれています。一部のアカウントは空のアカウントで、デフォルト値は0000, ,00.00.

現在、出力は次のとおりです。

ID#1234 joe     $436.0
ID#3620 kim     $600.0
ID#4563 Jimmy   $1653.0
ID#4571 Billy   $72.0
ID#5930 Brian   $962.0
ID#6766 Jen     $215.0
ID#7092 Adam    $8794.0

IDtxt ドキュメントにそのように記述されているため、 でソートされているようにしか見えません。どこから始めればよいかさえわかりません。ユーザーが入力した内容に応じて、IDまたはNameまたはそれに応じて並べ替える必要があります。Balanceがあることは知っていますが、array.sort(array)ここでは機能しません(考えすぎない限り)id,name,balance。その配列内の電流のみをソートするためです。もう一度助けていただければ幸いです。ありがとうございます。

名前で並べ替えると、次のように表示されます。

ID#7092 Adam    $8794.0
ID#4571 Billy   $72.0
ID#5930 Brian   $962.0
ID#6766 Jen     $215.0
ID#4563 Jimmy   $1653.0
ID#1234 joe     $436.0
ID#3620 kim     $600.0

残高で並べ替え:

ID#4571 Billy   $72.0 <br>
ID#6766 Jen     $215.0 <br>
ID#1234 joe     $436.0 <br>
ID#3620 kim     $600.0 <br>
ID#5930 Brian   $962.0 <br>
ID#4563 Jimmy   $1653.0 <br>
ID#7092 Adam    $8794.0 <br>

プログラムコード:

import static java.nio.file.AccessMode.*;
import java.nio.file.*;
import java.io.*;
import java.util.Arrays;

public class ReadBankSequentially
{
    public static void main(String[] args)
    {
        Path file = Paths.get("Bank.txt");
        String[] array = new String[3];
        String s = "";
        String delimiter = ",";
        int id;
        String stringId;
        String name;
        double balance;

        try
        {

            InputStream input = new BufferedInputStream(Files.newInputStream(file));
            BufferedReader reader = new BufferedReader(new InputStreamReader(input));
            System.out.println();
            s = reader.readLine();
            while(s != null)
            {
                array = s.split(delimiter);
                stringId = array[0];
                id = Integer.parseInt(array[0]);
                if(id != 0)
                {
                    name = array[1];
                    balance = Double.parseDouble(array[2]);
                    System.out.println("ID#" + stringId + " " + name + " $" + balance); 

                }
                s = reader.readLine();
            }
            reader.close();
        }
        catch(Exception e)
        {
            System.out.println("Message: " + e);
        }
    }
}
4

4 に答える 4

2

Customer 私はDTOを作成します:

public class Customer {
  protected int _id;
  protected String _name;
  protected float _balance;

  public Customer() {
    init(0, "New Customer", 0.00f);
  }

  public Customer(int id, String name, float balance) {
    init(id, name, balance);
  }

  private void init(int id, String name, float balance) {
    id(id).name(name).balance(balance);
  }

  public int id() {
    return this._id;
  }
  public Customer id(int id) {
    this._id = id;
    return this;
  }

  public String name() {
    return this._name;
  }
  public Customer name(String name) {
    this._name = name;
    return this;
  }

  public float balance() {
    return this._balance;
  }
  public Customer balance(float balance) {
    this._balance = balance;
    return this;
  }

  public String toString() {
    return String.format("#%d: %-5s - $%07.2f", id(), name(), balance());
  }
}

次に、ファイルを読み取って顧客を生成するユーティリティ クラスを作成します。

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Utils {  
  public static List<Customer> getCustomers(String filename, String delimiters) {
    List<Customer> customers = new ArrayList<Customer>();
    Customer customer = null;
    File file = new File(filename);
    Scanner scanner = null;
    try {
      scanner = new Scanner(file);
      while (scanner.hasNextLine()) {
        String line = scanner.nextLine();
        if ((customer = createCustomer(line, delimiters)) != null)
          customers.add(customer);
      }
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    } finally {
      scanner.close();
    }

    return customers;
  }

  public static Customer createCustomer(String line, String delimiter) {
    String[] arr = line.split(delimiter);
    if (arr.length < 3)
      return null;
    int id = Integer.parseInt(arr[0].trim());
    String name = arr[1].trim();
    float balance = Float.parseFloat(arr[2].trim());
    return new Customer(id, name, balance);
  }
}

最後に、 sBankを格納Customerし、並べ替え/出力できるクラスを作成します。

import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import static bank.Utils.getCustomers;

public class Bank {
  protected List<Customer> customers;

  public enum Sort {
    ID, NAME, BALANCE
  }

  public Bank() {
    String filename = "bank/Bank.txt";
    String delimiters = "[,]";
    customers = getCustomers(filename, delimiters);

    printCustomers(Sort.ID, false);
    printCustomers(Sort.ID, true);
    printCustomers(Sort.NAME, false);
    printCustomers(Sort.NAME, true);
    printCustomers(Sort.BALANCE, false);
    printCustomers(Sort.BALANCE, true);
  }

  public void sortId(boolean descending) {
    final int d = descending ? -1 : 1;
    Comparator<Customer> comparator = new Comparator<Customer>() {
      public int compare(Customer c1, Customer c2) {
        return (c1.id() > c2.id() ? 1 :
               c1.id() == c2.id() ? 0 : -1) * d;
      }
    };
    Collections.sort(customers, comparator);
  }

  public void sortName(boolean descending) {
    final int d = descending ? -1 : 1;
    Comparator<Customer> comparator = new Comparator<Customer>() {
      public int compare(Customer c1, Customer c2) {
        return (c1.name().compareTo(c2.name())) * d;
      }
    };
    Collections.sort(customers, comparator);
  }

  public void sortBalance(boolean descending) {
    final int d = descending ? -1 : 1;
    Comparator<Customer> comparator = new Comparator<Customer>() {
      public int compare(Customer c1, Customer c2) {
        return (c1.balance() > c2.balance() ? 1 :
               c1.balance() == c2.balance() ? 0 : -1) * d;
      }
    };
    Collections.sort(customers, comparator);
  }

  public void printCustomers(Sort sortBy, boolean descending) {
    String header = "";
    String desc = descending ? "descending" : "ascending";
    switch (sortBy) {
      case NAME:
        header = "Sorting by Name";
        sortName(descending);
        break;
      case BALANCE:
        header = "Sorting by Balance";
        sortBalance(descending);
        break;
      case ID:
        header = "Sorting by Id";
      default:
        sortId(descending);
        break;
    }
    System.out.printf("### %s %s ###\n", header, desc);
    for (Customer c : customers)
      System.out.println(c);
    System.out.println();
  }

  public static void main(String[] args) {
    new Bank();
  }
}

入力ファイル

1234,Joe,436.00
3620,Kim,600.00
4563,Jimmy,1653.00
4571,Billy,72.00
5930,Brian,962.00
6766,Jen,215.00
7092,Adam,8794.00

出力

### Sorting by Id ascending ###
#1234: Joe   - $0436.00
#3620: Kim   - $0600.00
#4563: Jimmy - $1653.00
#4571: Billy - $0072.00
#5930: Brian - $0962.00
#6766: Jen   - $0215.00
#7092: Adam  - $8794.00

### Sorting by Id descending ###
#7092: Adam  - $8794.00
#6766: Jen   - $0215.00
#5930: Brian - $0962.00
#4571: Billy - $0072.00
#4563: Jimmy - $1653.00
#3620: Kim   - $0600.00
#1234: Joe   - $0436.00

### Sorting by Name ascending ###
#7092: Adam  - $8794.00
#4571: Billy - $0072.00
#5930: Brian - $0962.00
#6766: Jen   - $0215.00
#4563: Jimmy - $1653.00
#1234: Joe   - $0436.00
#3620: Kim   - $0600.00

### Sorting by Name descending ###
#3620: Kim   - $0600.00
#1234: Joe   - $0436.00
#4563: Jimmy - $1653.00
#6766: Jen   - $0215.00
#5930: Brian - $0962.00
#4571: Billy - $0072.00
#7092: Adam  - $8794.00

### Sorting by Balance ascending ###
#4571: Billy - $0072.00
#6766: Jen   - $0215.00
#1234: Joe   - $0436.00
#3620: Kim   - $0600.00
#5930: Brian - $0962.00
#4563: Jimmy - $1653.00
#7092: Adam  - $8794.00

### Sorting by Balance descending ###
#7092: Adam  - $8794.00
#4563: Jimmy - $1653.00
#5930: Brian - $0962.00
#3620: Kim   - $0600.00
#1234: Joe   - $0436.00
#6766: Jen   - $0215.00
#4571: Billy - $0072.00
于 2013-04-20T22:14:52.233 に答える
0

まず、ファイルからの受信データをサポートするのに十分なデータを含む構造 (クラス) にデータを保存する必要があります。BankAccountそれをクラスと呼びましょう:

public class BankAccount {
    //NOTE: you can change the type of the elements used here, like double per BigDecimal
    private long id;
    private String owner;
    private double amount;
    //class constructors...
    //getters and setters...
}

次に、これらのオブジェクトを、配列やList. 私はお勧めしList<BankAccount>ます:

public class Bank {
    private List<BankAccount> accounts = new ArrayList<BankAccount>();
    //getters and setters...
}

3 番目に、配列をソートする必要があります。学習段階にある場合は、配列をソートするアルゴリズムを実装する必要があります。Java の経験がある程度ある場合は、最初のパラメーターとして、および 2 番目のパラメーターとして使用Collections#sort(List, Comparator)して送信できます。アカウント所有者の名前に基づいてアカウントを並べ替えるコンパレータの例を定義します (匿名クラスを使用):List<BankAccount> accountsComparator<BankAccount>

public void sortByOwner() {
    Comparator<BankAccount> comparator = new Comparator<BankAccount>() {
        public int compare(BankAccount account1, BankAccount account2) {
            return account1.getOwner().compareTo(account2.getOwner());
        }
    };
    Collections.sort(accounts, comparator);
}
于 2013-04-20T22:16:49.607 に答える
0

簡単にするために、Userタイプを定義します。

class User
{
    public int id;
    public String name;
    public double balance;

    public User(int id, int name, int balance)
    {
        this.id = id;
        this.name = name;
        this.balance = balance;
    }
}

次に、そのComparatorタイプを定義します (異なる比較規則を使用できるため)。

class UserComparatorByBalance implements Comparator<User>
{
    public int compare(User a, User b)
    {
        if (a.balance > b.balance) return 1; // or -1
        if (a.balance < b.balance) return -1; // or 1
        return 0;
    }
}

次に、コレクション (リスト) を設定します。

        ArrayList<User> users = new ArrayList<User>();
        s = reader.readLine();
        while(s != null)
        {
            array = s.split(delimiter);
            stringId = array[0];
            id = Integer.parseInt(array[0]);
            if(id != 0)
            {
                name = array[1];
                balance = Double.parseDouble(array[2]);
                System.out.println("ID#" + stringId + " " + name + " $" + balance); 
                User user = new User(id, name, balance);
                users.add(user);
            }
            s = reader.readLine();
        }
        reader.close();

そして最後に、次のように並べ替えます。

Collections.sort(users, new UserComparatorByBalance());
于 2013-04-20T22:17:28.980 に答える
0

「AccountEntry」クラスを作成します。

class AccountEntry {
  String id;
  String name;
  int balance;
}

3 つの「コンパレータ」を作成します。

class IdComparator implements java.lang.Comparator {
  public int compare(Object o1, Object o2) {
    AccountEntry a1 = (AccountEntry) o1;
    AccountEntry a2 = (AccountEntry) o2;
    return a1.id.compareTo(a2.id);
  }
}

class NameComparator implements java.lang.Comparator {
  public int compare(Object o1, Object o2) {
    AccountEntry a1 = (AccountEntry) o1;
    AccountEntry a2 = (AccountEntry) o2;
    return a1.name.compareTo(a2.name);
  }
}

class BalanceComparator implements java.lang.Comparator {
  public int compare(Object o1, Object o2) {
    AccountEntry a1 = (AccountEntry) o1;
    AccountEntry a2 = (AccountEntry) o2;
    if (a1.balance > a2.balance)
      return 1;
    if (a1.balance == a2.balance)
      return 0;
    return -1;
  }
}

並べ替え

Collections.sort(List, comparator)
于 2013-04-20T22:16:14.213 に答える