0

配列リストに値を入力するときに、この値が既に追加されているかどうかを確認する必要がある問題を解決しようとしています。その場合、名前の行に沿ってメッセージを表示したい既に存在します

import java.util.*;

class Bank{

void command(){
 CommandReader commandReader=new CommandReader(this);
 commandReader.run();
}
ArrayList <Account> accounts=new ArrayList <Account>();

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

}
void print(String name){

System.out.println("Account of "+name);
int b=0;
for(int i=0; i<accounts.size(); i++){ 
  b=accounts.get(i).balance(name);
  break;
  } 
System.out.println("Balance: "+b);//dit moet naar account verwjizen op een of andere      manier zodat hij weet waar hij balance() moet zoeken
 }
void printAll(){

/*
for(int i =0; i<accounts.size()-1;i++){
 print(accounts[i].name);//klopt niet, weet niet wat er wel moet staan
}*/
}
void enroll(String name){
Account account=new Account(name,0);
accounts.add(account);
}
void deposit(String name, int amount){
for(int i=0; i<accounts.size(); i++){
  accounts.get(i).deposit(amount, name);
  } 
}


 void withdraw(String name, int amount){//hiervoor moet je denk ik een methode in account maken zodat e met balance kan rekenen?
for(int i=0; i<accounts.size(); i++){
  int x;
  x=accounts.get(i).balance(name);
  if (x>-1000){
  amount = amount*-1;
   accounts.get(i).deposit(amount, name);

  } 
}
}
  void printRed(){

}
void interest(double rate){
for(int i=0; i<accounts.size(); i++){
  accounts.get(i).inter(rate);
}
 }   

}

class Account{
String name;
int balance;

void inter(double rate){
 balance+=rate
   /100*balance;
}

Account(String n, int b){//weet niet of dit nodig is, denk het wel
 this.name=n;
 this.balance=b;
}
String name(){
  return this.name;      
} 
int balance(String name){
  if(name.equals(this.name)){
    return this.balance;
  }
  return 0;
}
void deposit(int b, String name){
  if(name.equals(this.name)){
  this.balance+=b;
  }
}
 }

メソッドを介して配列に値を追加する私の方法です(ゼロは無視できます)

4

2 に答える 2

3

次の 2 つの方法で実行できます。

  1. 比較を自分で書いてください。次に、すべての配列要素を調べて、オブジェクトが既に存在するかどうかを確認します。

  2. クラスにメソッドをAccountオーバーライドさせてから、オブジェクトがリストに既に存在するかどうかを確認するために使用します。equalshashCodeList#contains

    これの短い例:

    Account account = new Account(name,0);
    //this assumes that Account class has already overridden equals and hashCode methods
    if (!accounts.contains(account)) {
        accounts.add(account);
    }
    

後者を使用する場合は、オブジェクトがコレクション内で一意であることを s が既に処理しているため、 aSetではなくa を使用することをお勧めします。ListSet


あなたの編集から、現在のエラーは、AccountクラスがオーバーライドequalshashCodeなければならないということです。これを行うと、コードは期待どおりに動作します。

両方の基本的な実装を提供します。

class Account {
    String name;
    int balance;

    void inter(double rate) {
        balance+=rate
       /100*balance;
    }

    Account(String n, int b) {
        this.name=n;
        this.balance=b;
    }
    String name() {
        return this.name;
    }
    int balance(String name) {
        if(name.equals(this.name)) {
            return this.balance;
        }
        return 0;
    }
    void deposit(int b, String name){
        if(name.equals(this.name)){
            this.balance+=b;
        }
    }
    //from here, this is the code you need
    @Override
    public boolean equals(Object o) {
        if (o == this) {
            return true;
        }
        if (o instanceof Account) {
            Account another = (Account)o;
            return this.name.equals(another.name);
        }
        return false;
    }
    @Override
    public int hashCode() {
        //if working with Java 7, uncomment below LoC
        //return java.util.Objects.hash(name, balance);
        //if using Java SE 6 or less
        return java.util.Arrays.hashCode(new Object[]{ name, balance });
    }
}
于 2013-09-29T17:46:16.873 に答える
0

オーバーライドequals()hashcode()Set代わりに使用し、無視したかどうかに応じてそのadd()戻り値を返しますboolean

于 2013-09-29T17:45:51.537 に答える