犬ぶよツールズ制作記録

Javaによる研究生活のためのパッケージ、犬ぶよツールズ。
その開発と保守のための備忘録

JythonのarrayとJavaのarray

2011-08-25 17:08:52 | Weblog
JythonのarrayとJavaのarrayは、異なるクラスである。
機能が異なるので当然だ。

JythonのarrayはつまりPythonで規定されているarrayだ。
>>> x = [1.0, 1.0, 1.0, 1.0]
>>> x
[1.0, 1.0, 1.0, 1.0]

Javaのarrayはjarrayモジュールで作れる。
>>> import jarray
>>> ax = jarray.array([0], 'd')
>>> ax
array('d', [0.0])


arrayを引数に取るJavaのメソッド(これは当然Javaのarrayを受け取る)に
Jythonのarrayを渡しても、不平を言わずに動作する。

>>> from java.lang import String
>>> s = String(['n', 'e', 'k', 'o'])
>>> s
neko

そして上手くいっているように見える。

ところが、引数のarrayに作用するメソッドの場合、このやり方だと効果が何も得られない。

>>> from java.util import Arrays
>>> x = [0, 0, 0, 0]
>>> Arrays.fill(x, 1)
>>> x
[0, 0, 0, 0]

引数のarrayに作用するJavaメソッドの場合、Javaのarrayにしてから渡すとよい。

>>> from java.util import Arrays
>>> import jarray
>>> x = [0, 0, 0, 0]
>>> jx = jarray.array(x, 'd')
>>> jx
array('d', [0.0, 0.0, 0.0, 0.0])
>>> Arrays.fill(jx, 1)
>>> jx
array('d', [1.0, 1.0, 1.0, 1.0])

これは期待通りだ。

具体例をもう1つ。
手前味噌だが、Inubuyo Permutation (犬ぶよ置換)パッケージから。


>>> from jp.inubuyo.brain.disc.perm import *
>>> sigma = Transposition()
>>> sigma
jp.inubuyo.brain.disc.perm.Transposition[0,1]
>>> x = [1, 2, 3, 4]
>>> sigma.act(x)
array('l', [2L, 1L, 3L, 4L]) ←結果はJavaのarray
>>> x
[1, 2, 3, 4]        ←変わってない
>>> jx = jarray.array(x, 'l')
>>> sigma.act(jx)
array('l', [2L, 1L, 3L, 4L]) ←結果はJavaのarray
>>> jx
array('l', [2L, 1L, 3L, 4L]) ←変わった

やはり、Jythonのarrayは影響を受けず、Javaのarrayは作用を受ける。



最新の画像もっと見る