返回数组java的元素

时间:2014-01-10 20:20:56

标签: java python

这是我的Python代码

def string(data):
    n=0
    while True:
        yield data[n]
        n+=1
        n%=len(data)

这是我调用string方法的Java代码:

for(int i = 0; i < lengthText; i++) {
              out[i] += string(t1) ^ string(t2);

         }

string方法:

public byte string(byte[] a){
    int i = -1;
     while(true){
        i++;
        i%= a.length;
        return a[i];            
     }
}

如果我理解正确,它应该返回序列数据中的下一个项目,一旦序列结束 - 将您带到开头,依此类推到无穷大。

1 个答案:

答案 0 :(得分:0)

Java中没有yield的直接替代品。您可以尝试用一些小类来模拟它,例如

class YieldSubstitute<Data> {
    private int    n;
    private Data[] data;

    public YieldSubstitute(Data[] data) {
        this.n    = 0;
        this.data = data;
    }

    public Data getNext() {
        Data toReturn = data[n];
        n = (n + 1) % data.length;
        return toReturn;
    }
}

然后使用它:

YieldSubstitute<Data> ys = new YieldSubstitute<Data>(data);
Data data1 = ys.getNext();
Data data2 = ys.getNext();
...

在这种情况下你需要记住yield是特定于Python的元素并且首先在Java中使用它你需要找到一些共同点 - 你可以实现仔细分析你的函数实际在做什么。 / p>

另一方面 - 您对发电机的使用无效。您应首先使用参数初始化它,然后获取结果序列:

generator = string(data)
data1 = next(generator)
data2 = next(generator)
...

您的Java代码基本上是针对在第一次迭代时被破坏的无限循环。在尝试将return视为yield之前,您应该在python中了解yieldreturn之间的差异。

编辑:根据您的描述,您需要的是:

byte[] out = new byte[lengthText]; // initialized with 0s
int n = 0;
for (int i = 0; i < lengthText; i++) {
    out[i] = data1[n] ^ data2[n]; // assuming that both arrays have more that 0 elements
    n = (n + 1) % Math.min(data1.length, data2.length); // just in case their length differ
}

data1data2都属于byte[]类型。如果他们的长度保证相等,你可以跳过Math.min