我从基于空手道的API自动化的JSON响应中获得一些运行时值。我将它们存储到一个数组列表中,如:
* def ArrayList = Java.type('java.util.ArrayList')
* def Collections = Java.type('java.util.Collections')
ArrayList al = new ArrayList();
* eval for(var i = 0; i < actualPrice.length; i++) expectedPrice.add(actualPrice[i])
当我打印列表时,输出是:
[-150, -210, -100, -112.5]
上面的输出,当我在Collections.sort(al)的帮助下应用排序时,它抛出了以下错误:
class java.lang.Integer cannot be cast to class java. lang.Double (java.lang.Integer and java.lang. Double is in module java.base of loader.
我需要在空手道特征文件中使用Asc/Desc排序。有人能帮我一下吗?
Java等效代码是:
ArrayList al = new ArrayList();
al.add(-150);
al.add(-210);
al.add(-100);
al.add(-112.5);
System.out.println(al);
Collections.sort(al);
您正在将Integer
s和Double
s添加到同一个List
中。当排序方法试图比较Integer
和Double
时,它试图将Integer
转换为Double
,这失败了。
不要使用原始类型。如果需要向List
添加双值,请使用List<Double>
:
List<Double> al = new ArrayList<>();
al.add(-150.0);
al.add(-210.0);
al.add(-100.0);
al.add(-112.5);
System.out.println(al);
Collections.sort(al);
这样,你的List
的所有元素将是相同的类型,Collections.sort()
将不会有麻烦比较他们彼此。
猜猜我们刚刚添加了一个karate.sort()
API。不幸的是,这不是在0.9.9。因此,如果你可以开始尝试从源代码构建,这将有助于我们确认这是预期的工作。
这里是关于它应该如何工作的文档链接:https://github.com/intuit/karate/tree/develop#json-transforms
* def foo = [{a: { b: 3 }}, {a: { b: 1 }}, {a: { b: 2 }}]
* def fun = function(x){ return x.a.b }
* def bar = karate.sort(foo, fun)
* match bar == [{a: { b: 1 }}, {a: { b: 2 }}, {a: { b: 3 }}]
与此同时,你可以考虑将所有的排序逻辑移到一个Java util中,你可以从空手道调用它,并将JSON传入/输出——这可能比在Java集合中胡闹更简单。
提供对我有帮助的问题的答案:
方法:
-
首先检查在运行时添加的对象是否为Integer类型。
-
如果是Integer类型,则将其转换为Double。
-
转换后,将该对象替换为双值
-
执行排序。
for(Object o :al) { if(o instanceof Integer) { double o1 = (double)((Integer) o); al.set(al.indexOf(o),o1); } } Collections.sort(al); System.out.println(al ); Collections.sort(al,Collections.reverseOrder()); System.out.println(al );
输出:
[-150, -210, -100, -112.5] [-210.0, -150.0, -112.5, -100.0] [-100.0, -112.5, -150.0, -210.0]
希望它能帮助那些试图排序整数和双精度值的人。