我正在尝试使用deftype在Clojure中创建一个新类型来实现一个二维(x,y)坐标,它实现了一个"位置"协议.
我还想让它实现标准的Java equals,hashCode和toString方法.
我最初的尝试是:
(defprotocol Location
(get-x [p])
(get-y [p])
(add [p q]))
(deftype Point [#^Integer x #^Integer y]
Location
(get-x [p] x)
(get-y [p] y)
(add [p q]
(let [x2 (get-x q)
y2 (get-y q)]
(Point. (+ x x2) (+ y y2))))
Object
(toString [self] (str "(" x "," y ")"))
(hashCode [self] (unchecked-add x (Integer/rotateRight y 16)))
(equals [self b]
(and
(XXXinstanceofXXX Location b)
(= x (get-x b))
(= y (get-y b)))))
Run Code Online (Sandbox Code Playgroud)
但是,如果b参数实现了Location协议,则equals方法仍需要一些方法.
什么是正确的方法?我是在正确的轨道上吗?
我有一个包含值0,1,2,....(N-1)int[]的长度数组N,即它表示整数索引的排列.
确定排列是奇数还是奇偶校验的最有效方法是什么?
(如果可能的话,我特别希望避免为临时工作空间分配对象......)
我正在使用程序技术为我正在编写的游戏生成图形.
为了生成一些树林,我想在以<0,0>为中心的正六边形区域内随机散布树木.
以统一的方式生成这些点的最佳方法是什么?
我正在创建一个Web Start应用程序,它将受益于一些较新的JVM选项(特别是转义分析,G1垃圾收集器等)
同时,我希望应用程序能够在不支持这些选项的旧JVM上正常工作.
有没有一个很好的方法来实现这一目标?
我正在寻找最有效的算法来随机选择一组n个不同的整数,其中所有整数都在某个范围[0..maxValue].
约束:
我最初的想法是构造一个整数列表[0..maxValue]然后随机提取n个元素而不替换.但这似乎效率很低,特别是如果maxValue很大的话.
更好的解决方案?
好吧,这听起来像是一个疯狂的想法 - 但我有兴趣用纯Java 模仿20世纪80年代风格的roguelike游戏文本界面,即使用Swing或类似的东西.
这大致是它需要做的事情:
任何人都知道一个好的现有解决方案,可以实现这一点 或者我是不是从头开始一起黑客攻击?
ps我想要纯Java的原因是它可以在沙盒applet中运行.所以像jcurses这样的JNI解决方案被遗憾地排除了......
在Java中实现阻塞函数调用的推荐/最佳方法是什么,以后可以通过另一个线程的调用解除阻塞?
基本上我想在一个对象上有两个方法,第一个调用阻塞任何调用线程,直到第二个方法由另一个线程运行:
public class Blocker {
/* Any thread that calls this function will get blocked */
public static SomeResultObject blockingCall() {
// ...
}
/* when this function is called all blocked threads will continue */
public void unblockAll() {
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
意图BTW不仅仅是为了获得阻塞行为,而是编写一种方法,在可以计算所需结果的某个未来点之前阻塞.
作为一个侧面项目,我正在创建一个用于图像合成的Clojure DSL(clisk).
我对函数命名的最佳方法有些不确定,其中我在DSL中具有与Clojure核心中的+函数类似的函数,例如我的DSL中需要函数或类似的东西以附加地组合图像/执行矢量数学运算.
据我所知,有几个选择:
+在我自己的命名空间中使用相同的名称().在DSL代码中看起来不错,但会覆盖clojure.core版本,这可能会导致问题.人们可能会感到困惑.my-ns/+).避免冲突,但use为了方便而阻止人们进入命名空间并且看起来有点难看.v+).可以很use容易地避免冲突,但名字有点难看,可能难以记住.vector-add).冗长但描述性,没有冲突.clojure.core/+和重新定义+(正如乔治克所建议的那样).示例代码可能类似于:
(show (v+ [0.9 0.6 0.3]
(dot [0.2 0.2 0]
(vgradient (vseamless 1.0 plasma) ))))
Run Code Online (Sandbox Code Playgroud)
什么是最好/最惯用的方法?
我有一个项目X,它在依赖关系层次结构中显示了很多冲突的依赖关系(如Eclipse的依赖关系层次结构视图中所示).我看到很多东西:
clojure: 1.3.0 (omitted for conflict with 1.4.0) [compile]
Run Code Online (Sandbox Code Playgroud)
这通常是因为X使用的两个库指定了某些其他库的两个不同版本 - 即由于共享的传递依赖性而发生冲突.在很多情况下,冲突是在我无法直接控制的第三方库中.
幸运的是,现在一切都建立并运行正常,但我担心这种情况将来可能会引发问题.
这是一个我应该担心的问题,如果是这样,我应该怎么做呢?
java ×6
algorithm ×3
clojure ×3
random ×2
swing ×2
blocking ×1
combinations ×1
concurrency ×1
deftype ×1
dependencies ×1
dsl ×1
equals ×1
jnlp ×1
jvm ×1
key-bindings ×1
key-events ×1
keylistener ×1
maven ×1
namespaces ×1
permutation ×1
protocols ×1
roguelike ×1