我正在尝试使用Java在H2数据库中创建聚合函数.该函数应从给定的Double列返回自定义中值计算.此计算包括使用max_variance int值仅使用与平均值足够接近的值.为此,我创建了这个类:
package custommedian;
public class CustomMedian implements org.h2.api.AggregateFunction{
final int max_variance = 7;
java.util.LinkedList<Double> values = new java.util.LinkedList<Double>();
@Override
public void init(java.sql.Connection cnctn) throws java.sql.SQLException {
// I ignored this
}
@Override
public int getType(int[] ints) throws java.sql.SQLException {
return java.sql.Types.DOUBLE;
}
@Override
public void add(Object o) throws java.sql.SQLException {
values.add((Double)o);
}
@Override
public Object getResult() throws java.sql.SQLException {
double average = 0;
java.util.Iterator<Double> i;
java.util.LinkedList<Double> properValues = new java.util.LinkedList<Double>();
// Get average value
for( i = values.iterator(); …Run Code Online (Sandbox Code Playgroud) 我发现了很多与此相关的问题,但我没有找到解决我问题的简单方法.
我找不到一种方法来使我的JTable排序正确的Double值.
我扩展AbstractTableModel以接收一个Class数组并返回每列的正确类型:
class TableModelMod extends AbstractTableModel{
private ArrayList data;
private String [] headers;
private Class [] types;
TableModelMod(String [] heads, ArrayList datas, Class [] classes){
headers = heads;
data = datas;
types = classes;
}
...
@Override public Class getColumnClass(int c){
if (c > types.length - 1)
return null;
else
return types[c];
}
...
Run Code Online (Sandbox Code Playgroud)
然后在我的自定义JTable构造函数中:
TableRowSorter<TableModelMod> sorter = new TableRowSorter<TableModelMod>((TableModelMod)getModel());
Run Code Online (Sandbox Code Playgroud)
但是在添加行时我遇到了这个错误:
java.lang.IllegalArgumentException: Cannot format given Object as a Number
Run Code Online (Sandbox Code Playgroud)
它在DecimalFormat.format(Object number, StringBuffer toAppendTo, FieldPosition pos)接受大多数数字类型但是Double的方法中失败.
如果我为Double列使用另一个类,我没有错误,但仍然排序不能按预期工作.我试过不同的数字类,但似乎没有正确排序双打:
@Override …Run Code Online (Sandbox Code Playgroud)