2017-11-03 4 views
0

このプロジェクトでは(私は初心者のようにBlueJを使用しています)、Climbersを名前、性別、年齢とともにArrayListに追加したいと考えています。登山家は、登山した山を追加することができます。山の名前と高さ。ArrayListから最大値を返すためにオブジェクトを比較する必要があります

特定の登山家が登った山のうち最も高い山を返すために、登山者クラスにメソッドを追加する必要があります。メソッドを定義するには

私は比較することが山のクラスのオブジェクトを確認する方法として、わからないよ、それは

public ArrayList<Mountain> getHighestMountain(Mountain mountainHeight) 

を使用して定義します。参考までに比較キーワードはまだ学習されていないので、これを使用しないことをお勧めします。

クラブクラス:

import java.util.ArrayList; 
import java.util.Scanner; 
/** 
* Write a description of class Club here. 
* 
* @author (your name) 
* @version (a version number or a date) 
*/ 
public class Club 
{ 
    // An ArrayList for storing climber details. 
    private ArrayList<Climber> climbers; 

    /** 
    * Constructor for objects of class Club 
    */ 
    public Club() 
    { 
     // Initialise instance variables. 
     climbers = new ArrayList<Climber>(); 
    } 

    public void addClimber(Climber newName) 
    { 
     climbers.add(newName); 
    } 


    public Climber getClimber(String name) 
    { 
     Climber foundClimber = null; 
     int index = 0; 
     boolean searching = true; 

     while(searching && index < climbers.size()) { 
      Climber climber = climbers.get(index); 
      if(climber.getName().equals(name)) { 
        searching = false; 
        foundClimber = climber; 
       } 
       else { 
        System.out.println(name + " not found"); 
        index++; 
       } 
      } 
      return foundClimber; 
     } 

    public void displayClimberList() 
    { 
     for (int item = 0; item<climbers.size(); 
     item++) { 
      Climber climber = climbers.get(item); 
      System.out.println(climber.getName() + (" ") + climber.getAge() + (" ") 
      + climber.getGender()); 
     } 
    } 

} 

クライマークラス:

import java.util.ArrayList; 
/** 
* Write a description of class Climber here. 
* 
* @author (your name) 
* @version (a version number or a date) 
*/ 
public class Climber 
{ 
    // Instance variables. 
    // The climber name. 
    private String name; 
    // The climber age 
    private int age; 
    // The climber gender. 
    private String gender; 
    private ArrayList<Mountain> mountains; 


    /** 
    * Constructor for objects of class Climber 
    */ 
    public Climber (String newName, int newAge, String newGender) 
    { 
     // Initialise instance variables. 
     name = newName; 
     age = newAge; 
     gender = newGender; 
     mountains = new ArrayList<Mountain>(); 

    } 

    /** 
    * Accessor method for climber's name. 
    */ 
    public String getName() 
    { 
     return name; 
    } 

    /** 
    * Set the climber's name. 
    */ 
    public void setName(String newName) 
    { 
     name = newName; 
    } 

    /** 
    * Accessor method for climber's age. 
    */ 
    public int getAge() 
    { 
     return age; 

    } 

    /** 
    * Set the climber's age. 
    */ 
    public void setAge(int newAge) 
    { 
     age = newAge; 

    } 

    /** 
    * Set the climer's gender. 
    */ 
    public String getGender() 
    { 
     return gender; 
    } 

    /** 
    * Accessor method for climber's gender. 
    */ 
    public void getGender(String newGender) 
    { 
     gender = newGender; 

    } 

    public Mountain addMountain(Mountain mountain) 
    { 
     return mountain; 
    } 

    public ArrayList<Mountain> getHighestMountain(Mountain mountainHeight) 
    { 
     double maxHeight = 1; 
     int index = 1; 
     for(int i = 0; i < mountainHeight.length; i++) { 
      if(mountainHeight[i].getHeight()>maxHeight) { 
       index = i; 
      } 
     } 




    } 
} 

マウンテンクラス:

/** 
* Write a description of class Mountain here. 
* 
* @author (your name) 
* @version (a version number or a date) 
*/ 
public class Mountain 
{ 
    // Instance variables. 
    private double height; 
    private String name; 

    /** 
    * Constructor for objects of class Mountain 
    */ 
    public Mountain(String mountainName, double mountainHeight) 
    { 
     // Initialise instance variables 
     name = mountainName; 
     height = mountainHeight; 
    } 

    /** 
    * Accessor method for mountain name. 
    */ 
    public String getName() 
    { 
     return name; 
    } 

    /** 
    * Set the mountain name. 
    */ 
    public void setName(String mountainName) 
    { 
     name = mountainName; 
    } 

    /** 
    * Accessor method for mountain height. 
    */ 
    public double getHeight() 
    { 
     // put your code here 
     return height; 
    } 

    /** 
    * Set the mountain height. 
    */ 
    public void setHeight(double newHeight) 
    { 
     height = mountainHeight; 
    } 
} 

私は、この値を返すようにしようとしましたが、あなたが見ることができるとして、それは不完全です。

ありがとうございます!

+1

maxHeight変数を見つけた実際の最大高さに更新する必要があります。現在、山は1よりも高いかどうかを比較しています。また、なぜこのメソッドは山のArrayListを返しますか?あなたは一つの山を探しています。そして、なぜそれに既存の山を渡すのですか?登山者はすでに山地のリストをフィールドとして持っています。なぜあなたはその関数にパラメータとして何かを渡す必要があるのか​​分かりません。 –

+1

また、 'getHighestMountain'はおそらくリスト全体ではなく'山 'のみを返すべきです。 – Berger

+1

ここには多くのことが間違っています。 addMountainメソッドは何も追加せず、単にパラメータを返します。あなたのgetHighestMountainは山を返しませんが、山のArrayListを返します。あなたはListの代わりにMountainというパラメータをループしています。 –

答えて

0

コメント

あなたのコメントを取り除く、彼らは任意の値を追加していません。あなたのコードにデフォルトのコメントを入れたり残したりしないでください。読みやすさが低下します。明確化も避け、別の変数やメソッドを意味のある名前で作成してみてください。インターフェース(例えば、リスト)を実装(ArrayListのような)

boolean userIsOnTheLastPage = (count - i) < pageSize; 
if (!userIsOnTheLastPage) { 
    addNextButton(); 
} 

インタフェース

Javaコレクション:例えば:

// check if the user is on the last page 
if (!((count - i) < pageSize)) { 
    addNextButton(); 
} 

になる可能性があります。通常は、使用した実装ではなく、インタフェースを宣言して渡したいと思うでしょう。コードの他の部分は、それらの実装方法ではなく、List機能の使用にのみ注意してください。

private List<Climber> climbers; 

またメソッドのパラメータまたは戻り型としてインターフェイスを使用して

private ArrayList<Climber> climbers; 

。このアプローチの結果、後で別のリスト実装を使用する場合は、コードの1か所で変更するだけです。これはあなたのコードのデカップリングの一形態です。これは良いことです。 ( '低結合、高い凝集')getClimberで

getClimber

検索実装では、ビット入り組んであります。私はこのようにそれを行うだろう:

for (Climber climber : climbers) { 
    if(climber.getName().equals(name)) { 
     return climber; 
    } 
}  
System.out.println(name + " not found"); 

私はあなたが反復からの復帰を回避しようとしているかもしれないが、私の意見では、コードがはるかに読みにくく、結果として取得します理解しています。 あなたのコードは、一致していない登山者のすべてに対して 'not found'と表示されます。私はそれがあなたの望むものではないと思っていたので、私のコードは、一致するクライマーが見つからなければ、一度しか印刷しません。

displayClimberList

public void displayClimbers() { 
    for (Climber climber : climbers) { 
     System.out.println(climber); 
    } 
} 

のSystem.out.printlnは、その引数にtoString()呼び出すので、私たちはクライマークラスに表示文字列の整形を残すことができます。

public class Climber { 

    private String name; 
    private int age; 
    private String gender; 

    // ... 

    public String toString() { 
     return String.format("%s %s %s", name, age, gender); 
    } 
  • ドン必要でない場合は、変数/メソッド名に型を記述しないでください。 Listが返されるという事実は、すでにメソッドのシグネチャから明らかです。
  • foreachは、索引を使用した方が読みやすくなりますので、可能であれば使用してください。インデックスを使用することを避けることはできません。たとえば、2つのリストを同時に反復する場合など、ここではそうではありません。
  • printf(またはString.format)は、文字列の連結よりも出力文字列の書式をはるかに簡単にします。 documentation of java.util.Formatter

性別を参照してください

私は列挙型にStringから性別フィールドを変更します

public class Climber { 

    private Gender gender; 

を列挙は次のようになります。

public enum Gender { 
    MALE, FEMALE; 
} 

を(それはですGender.javaという名前のファイルに別の最上位クラスがあります)。 the Oracle tutorial about enumsも参照してください。

addMountain

それは実際に山が追加されますので、addMountain方法を修正:

public void addMountain(Mountain mountain) { 
    mountains.add(mountain); 
} 

getHighestMountain

getHighestMountainのロジックは欠陥がある(これは、あなたの質問だった)、してみてくださいこれは:

public List<Mountain> getHighestMountain() { 
    Mountain highest = null; 
    for(Mountain mountain : mountains) { 
     if(highest == null || mountain.getHeight() > highest.getHeight()) { 
      highest = mountain; 
     } 
    } 
    return highest; 
} 
0

変更:

//This does absolutely nothing. It takes a parameter and returns it. 
public Mountain addMountain(Mountain mountain) { 
    return mountain; 
} 

public ArrayList<Mountain> getHighestMountain(Mountain mountainHeight) { 
    double maxHeight = 1; 
    int index = 1; 
    for(int i = 0; i < mountainHeight.length; i++) { 
     if(mountainHeight[i].getHeight()>maxHeight) { 
      index = i; 
     } 
    } 
} 

には:

//This adds the parameter mountain to the list of mountains for this climber 
public void addMountain(Mountain mountain) { 
    mountains.add(mountain); 
} 

//This loops over the mountains for this climber and returns the highest one. 
public Mountain getHighestMountain() { 
    Mountain highestMountain = null; 
    for(int i = 0; i < mountains.size(); i++) { 
     if (highestMountain == null) { 
      highestMountain = mountains.get(i); 
     } 
     else if(mountains.get(i).getHeight() > highestMountain.getHeight()) { 
      highestMountain = mounts.get(i); 
     } 
    } 
    return highestMountain; 
} 

あなたのコード例では、そのようなので、上のフィールドや変数、パラメータや戻り値の型やなどの基本的な概念の理解の欠如を示しています。私は言語の基礎hereを読むことをお勧めします。

関連する問題