1

ArrayList約 30,000 の値を持つ を作成しました。並べ替えた後、多くの連続した値があります。次に例を示します。

22001 22002 22003 22004 22010 22011 22020

そして、私は持っていたい: 22001 22004 22010 22011 22020

ArrayList<Long> l = new ArrayList<Long>(); // with my values
Collections.sort(l);
ArrayList<Long> liste = new ArrayList<Long>();
4

3 に答える 3

5

私はそれをテストしませんでしたが、動作するはずです (3 つ以上の要素を含むリストの場合)。メモリ使用量に関しては最適化されていません。

ArrayList<Long> resultList= new ArrayList<Long>();
Long prevNumber= l.get(0);
for (int i = 1; i < l.size() - 1; i++) {
    if (prevNumber.equals(l.get(i) - 1) && l.get(i + 1).equals(l.get(i) + 1)) {
        //print 'inbetween' consecutive number
    } else {
        //not a consecutive, copy it to result list
        resultList.add(l.get(i));
    }
    prevNumber= l.get(i);
} 
于 2013-05-13T10:06:57.277 に答える
0

問題は次のように大幅に単純化できると思います。

リストをループし、現在の番号が前の番号 + 1 でない場合、現在および前の値を結果セットに追加します。

つまり、「連続した範囲の開始と終了を追加する」と考えるのではなく、「ギャップが発生したときに両側を追加する」と考えてください。

擬似コード:

Set<Integer> resultSet = new LinkedHashSet<Integer>();

Integer prev = null;

for (Integer d : data) {
  if (prev == null) {  // first number
    resultSet.add(d);
  } else if (d != prev + 1) {  // a gap encountered
    resultSet.add(prev);
    resultSet.add(d);
  }
  prev = d;
}

if (prev != null) {  // last number
  resultSet.add(prev);
}

// resultSet will contain what you want.
于 2013-05-14T02:56:27.793 に答える
0

問題を解決するコードの簡単な例:

    int[] data =new int[] {22001, 22002, 22003, 22004,22005, 22010, 22011, 22020};

    System.out.println(data[0]); //The first element

    for(int current = 1; current < data.length-1; current++) {
        if(data[current+1] - data[current-1] != 2) {
            System.out.println(data[current]);
        }
    }

    System.out.println(data[data.length-1]);//The last element

コメント

これはどのように機能しますか?

次の項目が 1 より大きいことを確認する必要はありません。もっと興味があるのは、次の項目が現在から 2 つ離れていることです。

つまり、左隣が 1 小さく、右隣が 1 大きい場合、この要素を除外します。

于 2013-05-13T10:44:44.730 に答える