2015-04-05 52 views
1

我有一些用JavaScript编写的参考代码,我试图将它移植到Java。Java中具有Javascript数组类似性质的数组

我在移植时遇到的问题是,我没有任何Java可以同时用作堆栈和普通数组的东西。参考代码使用一个数组对象,它可以像普通数组一样工作,也可以像堆栈一样。

有什么我可以用来解决我的问题?

参考代码:

var ascii85 = function (input) { 
    // input: Array: an array of numbers (0-255) to encode 
    var result = [], 
     reminder = input.length % 4, 
     length = input.length - reminder; 
    c(input, length, result); 
    if (reminder) { 
     var t = input.slice(length); 
     while (t.length < 4) { 
      t.push(0); 
     } 
     c(t, 4, result); 
     var x = result.pop(); 
     if (x == "z") { 
      x = "!!!!!"; 
     } 
     result.push(x.substr(0, reminder + 1)); 
    } 
    return result.join(""); 
}; 

c函数的代码如下:

var c = function (input, length, result) { 
    var i, j, n, b = [0, 0, 0, 0, 0]; 
    for (i = 0; i < length; i += 4) { 
     n = ((input[i] * 256 + input[i + 1]) * 256 + input[i + 2]) 
      * 256 + input[i + 3]; 
     if (!n) { 
      result.push("z"); 
     } else { 
      for (j = 0; j < 5; 
       b[j++] = n % 85 + 33, n = Math.floor(n/85) 
      ); 
     } 
     result.push(String.fromCharCode(
      b[4], b[3], b[2], b[1], b[0])); 
    } 
}; 
+1

一位老学校的C程序员是否写过这样的代码?这不是很... JavaScript-y。 – vlaz 2015-04-05 19:35:32

+0

也“同时堆栈和正常数组” - 我试图看看这两者是什么需要在这里,但直到那时的预感 - 会列表工作?它实现了Stack接口,你可以做'list.get(n)'。 – vlaz 2015-04-05 19:37:51

+0

让我试一试使用List。 – Sunny 2015-04-05 19:40:00

回答

1

的Javascript Array.prototype.push对应于List#add

t.add(0); 

List没有模拟的Array.prototype.pop但你可以remove最后一个元素:

result.remove(t.size() - 1); 

因此,代码因此可转换为使用ArrayList,例如。

LinkedList允许push/pop以及索引访问,但其索引是O(n)。

还有Stack其中有push/pop和O(1)索引,但它是Vector的子类,其中的新代码通常不会使用。 (基本上Vector的操作是同步的线程安全,这是一个无意义的开销如果Stack没有线程之间共享。VectorCollections.synchronizedList在这方面所取代,所以Stack具有非常小众的功能集。)

我也看不出有问题,做一些类似如下:

public class MyList<E> extends ArrayList<E> { 
    public E pop() { 
     return this.remove(this.size() - 1); 
    } 
} 

它不会破坏里氏替换原则(仍表现为ArrayList)。

+0

非常感谢你:) – Sunny 2015-04-05 20:04:06

+0

Sorrry,是的 - 我正在寻找一个不同的'List'实现方式。 – vlaz 2015-04-05 20:07:47

+0

我认为Vid的解决方案也很有用,但还没有尝试过,但我认为它也应该起作用。感谢您的解决方案。 :) – Sunny 2015-04-05 20:10:57