2009-05-09 5 views
1

私はJavaに新しいので、いくつかの "厄介な"問題があります。私はint idNumberint phone numberを含むクラスEmployeeを持っています。その後、私はLinkedList<Employee>idNumberでソートしています。私は特定の電話番号を変更したいidnumber。 私はイテレータと一緒に作業していましたが、私が正しいことをしているかどうかはわかりません。LinkedListのパラメータを変更する

public void setNewPhoneNumber(int idnumber, int newphone){ 
     Iterator<IndexC> it = listEmployee.iterator(); 
     IndexC employeeTemp = null; 

     boolean found = false; 
     while(it.hasNext() && !found){ 
       employeeTemp = it.next(); 
       if(employee.getIdNumber()== idnumber){ 
        employeeTemp.setNewPhoneNumber(newphone); 
        found = true; 
       } 
     } 
} 

ええ、私はemployee.setNewPhoneNumberが間違っているけど、私は正しい方法は、LinkedListの上の値を変更しているか分かりません。あなたは「リンクリストでパラメータを変更」していない

+0

それは動作しませんか?どのようなエラーが出ますか?なぜそれはうまくいかないと思いますか? – Tom

答えて

1
  • (の悪い英語ではなく、ネイティブスピーカーのために申し訳ありませんが)、リスト内のオブジェクトを検索し、そのオブジェクトのプロパティを変更しようとしている
  • Listの代わりにMap( HashMapなど)を使用する必要があります。 を反復する必要はありません。
  • あなたが繰り返す場合は、forループを使用します。for(IndexC employeeTemp: employeeTemp){}
  • 電話NUMERを変更するには、従来setPhoneNubmer()方法を介して行われますが、それはそれは、このような方法があるかどうかIndexCクラスに完全に依存します。そのクラスの定義を見てください。
  • 質問するときは、必ずエラーメッセージを挿入してください。 「うまくいかない」というのは本当に役に立たない情報です。
-1

http://java.sun.com/j2se/1.4.2/docs/api/java/util/LinkedList.html

あなたはあなたが欲しい物を見つけるまで、int型のインクリメントでループに使用します。次に、listEmployee.get()を使用して、必要なオブジェクトを取得して編集したいとします。

ただし、そのようなアイテムにランダムアクセスが必要な場合は、リンクされたリストを使用しないでください。代わりにArrayListに貼り付けてください。それははるかに良いランダムアクセス時間を持っています。

ID番号が0から順番に並んでいる場合、副次的な注意として、forループは必要ありません。あなたは単にlistEmployee.get(idNumber)

+0

listEmployee.get(idNumber)は、少なくともidNumber要素がある場合にのみ機能します。リストのidNumber番目​​の要素を取得します。それは地図ではありません。 – Tom

+0

HashMapまたはTreeMapは、ランダムアクセスのArrayListよりはるかに優れています。 – Milhous

+0

キーで特定のオブジェクトを検索する場合は、リストではなくマップを使用する必要があります。また、リストを反復するときは、foreachループ、またはリストイテレータを使用する他のメソッドを使用することをお勧めします。これは、基礎となる実装がより効率的に反復を実行できるためです。 – Rob

0

の理由から、(employee.getIdNumber()== idnumber)を満たすリストにIndexCが存在しないという理由があります。

多分、あなたは何かでいっぱいになったそのリストがどこにあるかなど、いくつかの余分なコードを投稿するべきでしょうか?

さらに、それはどういうわけではありませんか?新しい電話番号の設定、またはリストからの要素の取得?どちらの場合も

は、私は多分Map実装を使用すると良いだろう、マイク・B.が言うようにそれは

getIdNumber(); 

である、あなたは両方の方法を投稿するべきだと思います。あなたは順序を考えているので、SortedMap(TreeMapなど)の実装が優れている可能性があります。

いずれの場合でも、(マップを使用する場合)IndexCの2つのメソッドをオーバーライドする必要があります。さもなければ、物事は乱雑になるでしょう。

  • のhashCode
2

イテレータが痛みます等しいです。 foreach構文が大きく進歩です:

public void setNewPhoneNumber(int idnumber, int newphone) { 
     for (Employee employee : listEmployee) 
       if (employee.getIdNumber() == idnumber) { 
        employee.setNewPhoneNumber(newphone); 
        return; 
       } 
} 

私はIndexCが何であるかについては明らかではないよ、と私はしばしばのLinkedListを使用していない - 「私はあなたを考える - ここにいくつかの微妙があるかもしれません私が欠けていますイテレータを避けるほうがよい。

+0

foreach構文は構文的な砂糖であり、イテレータは後ろに使われていることを誰かが明確にすべきだと思います(私はそれをします)。 – Tom

+1

ええ、イテレーターは、私がそれらを見る必要がない限り、大丈夫です。 :-) –

+0

あなたはまたブレークを使用することもできます。関数の途中でこれをやっているのではなく、戻ります。 –

0

私の悪い、IndexCはEmployeeクラス、 "悪いコピー過去"は申し訳ありません。私はLinkedListが好きではありませんが、私は+5000項目(学校運動)でそれを使用しなければなりません。私は非常に多くのエントリーがあるのをお勧めします。 クラスのセット、取得、クローン..

class Manager{ 
private LinkedList<Employee> listE = new LinkedList<Emploee>; 

public void setNewPhoneNumber(int idnumber, int newphone) 
} 
+0

ゲッターが見つかりませんでした – Tom

関連する問題