Общая арифметика в Java - PullRequest
       25

Общая арифметика в Java

0 голосов
/ 19 октября 2010

У меня есть класс фильтра, в котором пользователь должен объявить тип (например, 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 и т. Д.) Спасибо Chris

EDIT:

Извиняюсь за неясность. Боюсь, это не домашнее задание, эти дни давно позади. Я довольно новичок в Java, пришедший из C ++ фона (отсюда ожидание легкой перегрузки операторов). Что касается метода «толчка». Я приношу извинения за добавленный там метод add, то есть просто добавление значения в список, а не добавление переменных, на которое я ссылался (тогда я сделал пометку, чтобы изменить имя моего метода!). Этот класс используется для предоставления интерфейса для создания Списка заданной длины, заполнения его переменными и получения среднего значения по последним кадрам 'x', чтобы сгладить любые скачки в данных. Когда новый объект добавляется в объект FilterData, он добавляется в начало списка, а последний объект удаляется (при условии, что список достиг максимально допустимого размера). Итак, чтобы обеспечить непрерывное скользящее среднее, я должен суммировать и делить значения в списке. Однако для выполнения этого сложения мне нужно будет найти способ сложения объектов вместе. (Это просто вспомогательный класс, поэтому я хочу сделать его как можно более универсальным). Это делает это более ясным? (Я знаю, что код очень похож на Микки Мауса, но я хотел сделать его максимально понятным и простым).

1 Ответ

1 голос
/ 19 октября 2010

То, что вы пытаетесь сделать, это создать Queue объектов Number с фиксированным размером, по которому вы хотите вычислить среднее значение.В простейшей ситуации, когда у вас size = 2 и вы храните два целых числа 1 & 2, у вас есть среднее значение 1.5, поэтому разумно установить тип возвращаемого значения вашего метода фильтрации на удвоение.

Затем вы можете написать этот код, похожий на этот

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;
    }
}

Обратите внимание, что это не потокобезопасно.

...