java - Java 中的通用算术

标签 java generics operator-overloading math

我有一个过滤器类,其中用户必须声明类型(例如 Filter<Double>Filter<Float> 等)。然后,该类实现移动平均过滤器,因此必须添加该类内的对象。我的问题是如何做到这一点?如果答案很简单,我很抱歉,但我认为我想得太多,把自己搞糊涂了:p。

public abstract class FilterData<T>
{
private final List<T> mFilter;
private T mFilteredValue; // current filtered value
protected Integer mSize = 10;
private T mUnfilteredValue; // current unfiltered value

public FilterData()
{
    mFilter = new ArrayList<T>();
}

public FilterData(int size)
{
    mSize = size;
    mFilter = new ArrayList<T>(mSize);
}

public abstract T add(final T pFirstValue, final T pSecondValue);

@SuppressWarnings("unchecked")
public T filter(T currentVal)
{
    T filteredVal;
    mUnfilteredValue = currentVal;
    push(currentVal);

    T totalVal = (T) (new Integer(0));
    int numNonZeros = 1;
    for (int i = 0; i < mFilter.size(); ++i)
    {
        if (mFilter.get(i) != (T) (new Integer(0)))
        {
            ++numNonZeros;
            T totalValDouble = add(mFilter.get(i), totalVal);
            totalVal = totalValDouble;
        }
    }
    Double filteredValDouble = (Double) totalVal / new Double(numNonZeros);
    filteredVal = (T) filteredValDouble;
    mFilteredValue = filteredVal;
    return filteredVal;
}

public T getFilteredValue()
{
    return mFilteredValue;
}

public List<T> getFilterStream()
{
    return mFilter;
}

public T getUnfilteredValue()
{
    return mUnfilteredValue;
}

public void push(T currentVal)
{
    mFilter.add(0, currentVal);
    if (mFilter.size() > mSize)
        mFilter.remove(mFilter.size() - 1);
}

public void resizeFilter(int newSize)
{
    if (mSize > newSize)
    {
        int numItemsToRemove = mSize - newSize;
        for (int i = 0; i < numItemsToRemove; ++i)
        {
            mFilter.remove(mFilter.size() - 1);
        }
    }
}
}

我包含抽象 Add 方法是否正确?如果是,我应该如何正确扩展该类以涵盖基本类型(例如 Float、Double、Integer 等) 谢谢 克里斯

编辑:

抱歉不清楚。恐怕这不是作业,那些日子已经过去了。我对 Java 很陌生,因为我有 C++ 背景(因此期望操作符重载很容易)。至于“推”法。我对其中的添加方法表示歉意,这只是将一个值添加到列表中,而不是我所指的变量添加(然后记下更改我的方法的名称!)。该类用于提供一个接口(interface)来构造指定长度的列表,用变量填充它并获取最后“x”帧的平均值以消除数据中的任何尖峰。当一个新项目添加到 FilterData 对象时,它会添加到 List 的开头,并删除最后一个对象(前提是 List 已达到允许的最大大小)。因此,为了提供连续移动平均值,我必须对列表中的值进行求和和除法。 但是,要执行此添加,我必须找到一种将对象添加在一起的方法。 (它只是一个辅助类,所以我想让它尽可能通用)。这样是不是更清楚了? (我知道代码非常米老鼠,但我想让它尽可能清晰和简单)。

最佳答案

您想要做的是创建一个 Queue具有固定大小的 Number 对象,您要计算其平均值。对于大小 = 2 并存储两个整数 12 的简单情况,您的平均值为 1.5,因此设置过滤器方法的返回类型为 double。

然后您可以编写与此类似的代码

public abstract class FilterData<T extends Number> {
    private final Queue<T> mFilter = new LinkedList<T>();
    protected Integer mSize;

    public FilterData() {
        this(10);
    }

    public FilterData(int size) {
        mSize = size;
    }

    public double filter(T currentVal) {
        push(currentVal);

        double totalVal = 0d;
        int numNonZeros = 0;
        for (T value : mFilter) {
            if (value.doubleValue() != 0) {
                ++numNonZeros;
                totalVal += value.doubleValue();
            }
        }

        return totalVal / numNonZeros;
    }

    public void push(T currentVal) {
        mFilter.add(currentVal);
        if (mFilter.size() > mSize)
            mFilter.remove();
    }

    public void resizeFilter(int newSize) {
        if (mSize > newSize) {
            int numItemsToRemove = mSize - newSize;
            for (int i = 0; i < numItemsToRemove; ++i) {
                mFilter.remove();
            }
        }
        mSize = newSize;
    }
}

您应该注意,这不是线程安全的。

关于java - Java 中的通用算术,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3967064/

相关文章:

Java 传递泛型对象

C++ 多项式类,指针数组问题

javax UriBuilder 未正确转义 '}'

具有通用函数参数的 Swift 数组扩展

java - 显示 GUI 的问题

delphi - 有没有一种简单的方法将 TDictionary 内容复制到另一个中?

c++ - C++中的重载赋值运算符

c++ - 当重载为类的成员函数时,取消引用运算符 (*) 是如何工作的?

java - 如何在不耗尽堆空间的情况下使用 PDFBox 将多个小型 PDF 合并为一个?

java - 如何获取剪贴板客户端内容并将其作为文件发送到服务器