例として、次の単純な Python 関数を考えてみましょう。
def quantize(data, nlevels, quantizer=lambda x, d: int(floor(x/d))):
llim = min(data)
delta = (max(data) - llim)/(nlevels - 1) # last level x == max(data) only
y = type(data)
if delta == 0:
return y([0] * len(data))
else:
return y([quantizer(x - llim, delta) for x in data])
そして、ここでそれが実行されています:
>>> from random import random
>>> data = [10*random() for _ in range(10)]
>>> data
[6.6181668777075018, 9.0511321773967737, 1.8967672216187881, 7.3396890304913951,
4.0566699095012835, 2.3589022034131069, 0.76888247730320769, 8.994874996737197,
7.1717500363578246, 2.887112256757157]
>>> quantize(data, nlevels=5)
[2, 4, 0, 3, 1, 0, 0, 3, 3, 1]
>>> quantize(tuple(data), nlevels=5)
(2, 4, 0, 3, 1, 0, 0, 3, 3, 1)
>>> from math import floor
>>> quantize(data, nlevels=5, quantizer=lambda x, d: (floor(x/d) + 0.5))
[2.5, 4.5, 0.5, 3.5, 1.5, 0.5, 0.5, 3.5, 3.5, 1.5]
この関数には確かに欠陥があります -- 一つには、引数を検証しません。また、戻り値の型を設定する方法についてはよりスマートにする必要があります -- しかし、データ内の要素が整数または浮動小数点数またはその他の数値型。また、デフォルトでは int のリストを返しますが、オプションの quantizer 引数として適切な関数を渡すことで、この型を別のものに変更できます。さらに、データ パラメータがリストの場合、返される値はリストになります。data がタプルの場合、戻り値はタプルになります。(この最後の機能は確かに最も弱い機能ですが、Java で複製することに最も関心がない機能でもあるため、わざわざそれをより堅牢にすることはしませんでした。)
この関数に相当する効率的なJavaを書きたいと思います。つまり、Java の型付けを回避する方法を考え出すことです。私が Java を学んで以来 (かなり前)、言語にジェネリックが導入されました。Javaジェネリックについて学習しようとしましたが、かなり理解できないことがわかりました。これが早期発症の老化によるものなのか、それとも Java で最後にプログラミングして以来 (約 2001 年) に Java の複雑さが大幅に増加したためなのかはわかりませんが、このトピックに関するすべてのページは、以前のページよりも混乱しています。 1。誰かがJavaでこれを行う方法を教えてくれたら本当にありがたいです。
ありがとう!