2017-03-22 13 views
0

私は3人のarraylistsを持っています。 2つは、キャンバス上の点の座標を保持します(xCoord、yCoord)。これはdot to dotプログラムです。 3番目のarraylistは、結果として得られる画像の最低の「ダメージ」または傷害を伴うキャンバスからどのドットを除去できるかを計算するコードを保持しています。これは、「クリティカルな値」を返す単純なアルゴリズムに基づいています。より小さい臨界値を有するドットは、臨界値が高いドットよりも画像を傷つけない。別のArrayListに基づいてArrayListの要素を削除します

私の問題は、最小の臨界値に基づいてxとyのarraylistsからn個のドットを削除することです。私はユーザー入力用のコードを既に実装しています。

public void removeDots(int numberDesired){ 
    int i = 0; 

    for (i =0; i<numberDesired; i++){ 

     xCoord.remove(critDots.get(i); //No idea, just trying random things. 
     yCoord.remove(critDots.get(i); 

    } 
} 


    for (i = 0; i < xCoord.size()-1; i++) { 
      critValue = Algorithm Calculations 
      critDots.add(critValue); 
     } 

私が最も重要に少なくともから重要整理する

Collections.sort(critDots) 

を使用して考えてきましたが、私はこれが私のxCoord/YCOORDのためにどのように影響するかがわからないんです。

私が正しい方向に向かう手助けをするちょっとしたヒントをいただければ幸いです。 また、xCoord、yCoord、およびcritDotsはすべてarraylistsです。

+0

'第3のarraylistは、キャンバスからどのドットを取り除くことができるかを計算するコードを保持しています.''によって' x'と 'y'座標のペアを削除しますか? –

+0

はいいいえ – Fed148

+1

コードの一部を説明する代わりに、完全な[mcve]を指定してください。質問は、例えば、あなたはそれらのリストにどのような種類のオブジェクトを格納していますか?私が推測するように、誤って(または逆の方法で)メソッドを削除(インデックス)する代わりにremove(オブジェクト)を呼び出すことが多分あります。これはIntegerオブジェクトにint値を自動的にボクシングするために発生します。実際、そういう場合が最も多いでしょう。 – GhostCat

答えて

0

別のDotクラスであなたのxとyの値を入れてください:

class Dot { 
    private final int x; 
    private final int y; 

    // hashValue and equals methods 
} 

ストアリストでキャンバス上のドットのリスト:

List<Dot> dots; 

を。これは、はるかに良いと思われますxとyの座標を別々のリストに格納するよりも、あなたのためのモデルです。また、モデルを変更することなくドット(例えば色)にアトリビュートを追加することができるので、OOデザインが優れています。

最小の損傷を引き起こすドットを得るためにあなたの「ダメージ」アルゴリズムを使用します。

List<Dot> toRemove = dots.stream() 
    .sort(comparingInt(d -> calculateDamageForDot(d))) 
    .limit(numberToRemove) 
    .collect(toList()); 

あなたがストリームに慣れていない場合は、私がコメントで知っていると私は古いスタイルの反復を提供します同等のことをします。

そして、最後に、最小のダメージでドットを取り除く:あなたはdotによってあなたがxy座標のペアを意味ArrayListからそれらを除去しながら、あなたはそれらの両方が必要だと言ったように

dots.removeAll(toRemove); 
+0

ありがとう、Dotクラスを作ることは、私がそれをする意味があります。 – Fed148

0

。単にxyのペアを見つけて削除してください。

注文を保存しなければならないので、両方を削除することを忘れないでください。

public void removeDots(int x, int y){ 
    //find that pair 
    for(i=0; i<xCoord.size(); i++) { 
     if(xCoord.get(i) == x && yCoord.get(i) == y) { 
      xCoord.remove(i); 
      yCoord.remove(i); 
      break; //don't remove this break if there are duplicate co-ordinates in your lists. 
     } 
    } 
} 

今、単純に上記のメソッドを呼び出して、それらを削除します。

... 
removeDots(3, 5); 
... 

しかし、代わりに、このように二つの配列リストを管理するあなたの「ドット」のためのカスタムデータ型を作成する方が良いだろう。

関連する問題