2

javax.swing.JPanel呼び出されたcalcResPanel( java.awt.GridLayoutwith列と1不定 ( 0) 行を使用) があります。私はそれに次の動作を与えることもできると考えました:BHSelectableLabeljavax.swing.JTextFieldStringresults

  1. 初めて、それは新しいものだけを追加します
  2. 以下の時間帯になります。
    1. すでに追加されているできるだけ多くのラベルのテキストを、できるだけ多くの値のテキストに変更しresultsます
    2. 変更されていないラベルが残っている場合は、不要なので削除します。それ以外の場合は、必要な数の新しいラベルを追加します。

これは私には理にかなっています。このアルゴリズムが私がすべきことではない場合は、今すぐ読むのをやめて、より良いアルゴリズムで回答を投稿してください。ただし、同意する場合は、コードで何が間違っていたか教えてください。

  int i, r, l;
  for (i=0, r = results.length(), l = calcResPanel.getComponentCount(); i < r; i++)
    if (i < l)
      ((BHSelectableLabel)calcResPanel.getComponent(i)).setText(results.get(i));
    else
      calcResPanel.add(new BHSelectableLabel(results.get(i)));
  for (;i < l; i++)//If there are excess, unused lables, remove them
    calcResPanel.remove(i);

このコードの問題は、余分なラベルが一貫性なく に残されることcalcResPaneです。このアルゴリズムの概念が優れていると思われる場合は、余分なラベルを残すコードの何が問題なのか教えてください。

答え


こんな簡単な答えも。とても賢いと思います^^;

  int i, r, l;
  for (i=0, r = results.length(), l = calcResPanel.getComponentCount(); i < r; i++)
    if (i < l)
      ((BHSelectableLabel)calcResPanel.getComponent(i)).setText(results.get(i));
    else
      calcResPanel.add(new BHSelectableLabel(results.get(i)));
  for (;i < l; i++)//If there are excess, unused lables, remove them
    calcResPanel.remove(r);
4

1 に答える 1

4
for (;i < l; i++)//If there are excess, unused lables, remove them     
    calcResPanel.remove(i); 

2 つおきの項目をスキップするため、そのような削除はできません。5 つのアイテムがあり、それらをすべて削除しようとするとします。

最初のループは i = 0 なので、アイテム 0 を削除すると、1、2、3、4 が残ります。

次回はループ i = 1 を通過するので、アイテム 2 を削除すると、1、3、4 が残ります。

パターンを取得していただければ幸いです。

解決策は、項目を最後から 1 つずつ削除することです。

于 2011-10-13T22:27:20.353 に答える