将简单的Python代码转换为Java方法

4
我找到了一个代码片段,可以在自动化比赛支架生成器中给我想要的东西:一个数组。
但是有一个问题。我不会读也不会写Python,但我精通(足够)Java。 我不知道这是否违反了堆栈溢出的礼仪,但我请求有人协助将此代码转换为Java方法。
def CBseed( n ):
    #returns list of n in standard tournament seed order
    #Note that n need not be a power of 2 - 'byes' are returned as zero
    ol = [1]
    for i in range( int(ceil( log(n) / log(2) ) )):
        l = 2*len(ol) + 1
        ol = [e if e <= n else 0 for s in [[el, l-el] for el in ol] for e in s]
    return ol

这将返回一个漂亮的结果

2 [1, 2] #seed 1 plays seed 2
3 [1, 0, 2, 3] #seed 1 gets a 'by' game and seed 2 plays seed 3
4 [1, 4, 2, 3] #ETC.
5 [1, 0, 4, 5, 2, 0, 3, 0]
6 [1, 0, 4, 5, 2, 0, 3, 6]
7 [1, 0, 4, 5, 2, 7, 3, 6]
8 [1, 8, 4, 5, 2, 7, 3, 6]
#and so on and so forth till this
31 [1, 0, 16, 17, 8, 25, 9, 24, 4, 29, 13, 20, 5, 28, 12, 21, 2, 31, 15, 18, 7, 26, 10, 23, 3, 30, 14, 19, 6, 27, 11, 22]
32 [1, 32, 16, 17, 8, 25, 9, 24, 4, 29, 13, 20, 5, 28, 12, 21, 2, 31, 15, 18, 7, 26, 10, 23, 3, 30, 14, 19, 6, 27, 11, 22]

因此,数组以两个为一组增加,每两个代表一场比赛。

4
我猜测倒数第二行让他困惑了,其他的都很容易理解。 - But I'm Not A Wrapper Class
3
嗨,@BLaZuRE。如果一个不熟悉 Python 的人看到 [e if e <= n else 0 for s in [[el, l-el] for el in ol] for e in s],可能会感到有些混乱。 - arshajii
1
@BLaZuRE 我不知道如何阅读Python。尽管这段小代码的强大功能让我想要学习它。 - jfldt15
@MohammadS。是的,完全正确。 - jfldt15
那个列表推导式过于复杂了,难道不可以简化为[e if e <= n else 0 for el in ol for e in (el, l-el)]吗?而且我不确定那个for循环是否必要。 - user2357112
显示剩余2条评论
1个回答

5
直接翻译的话,大概是这样的:
public static List<Integer> cbSeed(int n) {
    List<Integer> ol = new ArrayList<Integer>();
    ol.add(1);

    int max = (int) Math.ceil(Math.log(n) / Math.log(2));

    for (int i = 0; i < max; i++) {
        int l = 2 * ol.size() + 1;

        List<Integer> newOl = new ArrayList<Integer>(ol.size() * 2);
        for (int el : ol) {
            int e = el;
            newOl.add(e <= n ? e : 0);

            e = l - el;
            newOl.add(e <= n ? e : 0);
        }

        ol = newOl;
    }

    return ol;
}

如您所见,Java代码更冗长 :)


您可以看到这段代码与Python函数产生了相同的结果:

for (int i = 2; i < 9; i++)
    System.out.println(i + "\t" + cbSeed(i));
2   [1, 2]
3   [1, 0, 2, 3]
4   [1, 4, 2, 3]
5   [1, 0, 4, 5, 2, 0, 3, 0]
6   [1, 0, 4, 5, 2, 0, 3, 6]
7   [1, 0, 4, 5, 2, 7, 3, 6]
8   [1, 8, 4, 5, 2, 7, 3, 6]
这是一个数组列表,其中数字表示索引位置,方括号内的数字则表示该索引位置存储的值。这些数组看起来像是一些排序算法的输出结果。

1
啊,你比我先回答了。你的答案看起来更好,所以点个赞。如果有人想要了解Python中的for in,这个链接可能会有所帮助:http://docs.python.org/2/tutorial/datastructures.html#list-comprehensions - BLaZuRE
1
非常感谢。这正是我在寻找的!我也应该研究一下Python!! - jfldt15

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接