1

面白い問題があります

これがオブジェクトの構造です

public class Testdata {
    //Which is a consecutive running number i.e 1,2,3..etc
    private int sequence;

    //classified based on this again any random numbers
    private int window; 

    //need to calculate
    private int windowposition; 

}

シーケンスとウィンドウに基づいて、ウィンドウに関連するウィンドウ位置を導出する必要があります

テストデータ
したがって、テストデータシーケンス/ウィンドウ

        1 / 2
        2 / 3
        3 / 2
        4 / 3
        5 / 3

期待される出力

    sequence/window :   window position would be (in the same order)

    1 / 2       :   1

    2 / 3       :   1

    3 / 2       :   2

    4 / 3       :   2

    5 / 3       :   3

アップデート:

はい、確かに、私はすでに比較可能なものを実装し、リストを以下の順序に並べ替えました

1 / 2
3 / 2
2 / 3        
4 / 3
5 / 3

windowposition次に、ウィンドウに関連して各要素のを計算するにはどうすればよいですか?

4

4 に答える 4

1

Comparableを実装することはおそらく理にかなっています。これにより、オブジェクトを並べ替えることができます。compareTo(T)次のように実装します。

int compareTo(Testdata o) {
  return ((Integer)this.sequence).compareTo(o.sequence);
}

そうすれば、オブジェクトをシーケンスで並べ替えることができます。

windowここで、 1のすべてのオブジェクトをに収集し、 2Listのオブジェクトをwindow別のリストに収集します。

HashMap<Integer, ArrayList<Testdata>> map = new HashMap<Integer, ArrayList<Testdata>>();

// Add all the objects like this
while (...) { // While there are more objects
  Testdata td = ... // Get next object

  List<TestData> list = map.get(td.window);
  if (list == null) {
    list = new ArrayList<Testdata>();
    map.put(td.window, list);
  }

  list.add(td.sequence);
}

Collections.sort(List)を使用してすべてのリストを並べ替えます。

for (ArrayList<TestData> list : map) {
  Collections.sort(list);
}

次に、ウィンドウごとに1つのリストがあり、からアクセスできますmap.get(window)。これらの各リストには、sequence最初のオブジェクトとして最も低いオブジェクト、2番目のオブジェクトとして2番目に低いオブジェクトなどがあります。->ウィンドウ位置はオブジェクトのインデックス+1です。

編集:

オブジェクトがすでにウィンドウとシーケンスで(単一のリストに)ソートされている場合は、次のようにしてウィンドウの位置を割り当てることができます。

int window = 1;
int wp = 0;
for (Testdata td : list) {
  if (td.window > window) {
    wp = 1;
    window = td.window;
  } else {
    wp++;
  }

  td.windowposition = wp;
}
于 2012-08-16T13:06:31.427 に答える
0
So its basically window's no. of occurrence in the array of objects.
Seq/Window:Position
1 / 2 : 1    => Window 2 , 1st position (1st occurrence of Window 2)
2 / 3 : 1    => Window 3 , 1st position (1st occurrence of Window 3)
3 / 2 : 2    => Window 2 , 2nd position (since Window 2 has already positioned in sequence 1)
4 / 3 : 2    => Window 3 , 2nd position (since Window 3 has already positioned in sequence 2)
5 / 3 : 3    => Window 3 , 3rd position (since Window 3 has already positioned in sequence 2 and 4)

Is that right?

List<Window> windows = new ArrayList<Window>();
        windows.add(new Window(2, 3));
        windows.add(new Window(1, 2));
        windows.add(new Window(3, 2));
        windows.add(new Window(4, 3));
        windows.add(new Window(5, 3));

        Collections.sort(windows);

HashMap<Integer, Integer> wpMap = new HashMap<Integer, Integer>();
     Integer wpos;
        for (Window w : windows) {
            wpos = wpMap.get(w.window);
            if ( wpos == null ) { 
                wpos = 1;
            } else { 
                wpos++;
            }
            w.setWindowPosition(wpos);
            wpMap.put(w.window, wpos);
        }
    for (Window w : windows) {
        System.out.println(w.sequence+"/"+w.window+":"+w.windowposition);
    }
于 2012-08-16T12:49:39.317 に答える
0

したがって、windowpositionは単なる別のシーケンスです。Map<Integer,Integer>すべてのウィンドウの最後のウィンドウ位置に配置します。必ずしもオブジェクトを並べ替える必要はありません。

于 2012-08-16T12:44:56.037 に答える
0

このコードを試してください

windowposition = sequence - window < 0 ? 1 : sequence - window + 1;
于 2012-08-16T13:21:32.083 に答える