2015-05-13 1 views
1

Следующий код является частью проекта, в котором мне нужно определить минимальный/максимальный уровень данных. Проблема в том, что я не знаю, будет ли столбец содержать float или int. Моя попытка сделать общий класс для этого заключается в следующем, но это дает мне ошибку на currentVal > compareVal. Мой вопрос: где я ошибаюсь?Использование общих типов для вычисления с плавающей точкой и динамически динамически

public <T> List<DataRow> compare(boolean Int) { 
    for(int i = 0; i<table.getRowCount(); i++){ 
     T currentVal = (T) argument.resolve(row).getValue(); 
     DataRow compare = table.getRow(i); 
     T compareVal = (T) argument.resolve(compare).getValue(); 
     // if there's a new minimum or there's a new maximum 
     if((currentVal > compareVal && minimum) || (currentVal < compareVal && maximum)){ 
      row = compare; 
      rowlist.clear(); 
      rowlist.add(compare); 
     } 
     // if there's a duplicate minimum/maximum 
     else if(currentVal == compareVal) 
      rowlist.add(compare); 
    } 
    return rowlist; 
} 

, кстати, в первом случае утверждение, минимальное и максимальные являются булевыми, которые истинны либо если минимальным или максимальным должны быть рассчитаны.

Предполагается, что это альтернатива моим текущим методам;

public List<DataRow> floatCompare() { 
    for(int i = 0; i<table.getRowCount(); i++){ 
     float currentVal = (float) argument.resolve(row).getValue(); 
     DataRow compare = table.getRow(i); 
     float compareVal = (float) argument.resolve(compare).getValue(); 
     // if there's a new minimum or there's a new maximum 
     if((currentVal > compareVal && minimum) || (currentVal < compareVal && maximum)){ 
      row = compare; 
      rowlist.clear(); 
      rowlist.add(compare); 
     } 
     // if there's a duplicate minimum/maximum 
     else if(currentVal == compareVal) 
      rowlist.add(compare); 
    } 
    return rowlist; 
} 
public List<DataRow> intCompare() { 
    for(int i = 0; i<table.getRowCount(); i++){ 
     int currentVal = (int) argument.resolve(row).getValue(); 
     DataRow compare = table.getRow(i); 
     int compareVal = (int) argument.resolve(compare).getValue(); 
     // new minimum or new maximum 
     if((currentVal > compareVal && minimum) || (currentVal < compareVal && maximum)){ 
      row = compare; 
      rowlist.clear(); 
      rowlist.add(compare); 
     } 
     // duplicate minimum/maximum 
     else if(currentVal == compareVal) 
      rowlist.add(compare); 
    } 
    return rowlist; 
} 

Эти функции работают, но я хочу объединить их в общий класс, потому что они оба делают то же самое.

+1

Действительно ли они int/float или они Integer/Float? Что возвращает аргумент .resolve (row) .getValue()? Откуда эта переменная? – Necreaux

+0

Ваш код не компилируется, не могли бы вы его исправить? – igreen

+0

Я знаю, что он не компилируется, извините. Он работает на огромном back-end, содержащем структуру datarows и столбцов. argument.resolve (row) .getValue() возвращает значение, которое является либо float, либо int. Никогда и целое – logos

ответ

2

Мы можем делать сравнения в общем формате через интерфейс Comparable.

Возвращает:

отрицательное целое число, нуль или положительное целое число как этот объект меньше, равен или больше указанного объекта.

т.д .:

static <T extends Comparable<? super T>> T min(T lhs, T rhs) { 
    // same as ((lhs < rhs) ? lhs : rhs) 
    return (lhs.compareTo(rhs) < 0) ? lhs : rhs; 
} 

Оба Float и Integer реализации Comparable.

линия-для-лайн копию кода с помощью Comparable будет:

public List<DataRow> compare(boolean Int) { 
    for(int i = 0; i<table.getRowCount(); i++){ 
     Comparable currentVal = (Comparable) argument.resolve(row).getValue(); 
     DataRow compare = table.getRow(i); 
     Comparable compareVal = (Comparable) argument.resolve(compare).getValue(); 
     // if there's a new minimum or there's a new maximum 
     int comparison = currentVal.compareTo(compareVal); 
     if((comparison > 0 && minimum) || (comparison < 0 && maximum)){ 
      row = compare; 
      rowlist.clear(); 
      rowlist.add(compare); 
     } 
     // if there's a duplicate minimum/maximum 
     else if(comparison == 0) 
      rowlist.add(compare); 
    } 
    return rowlist; 
} 

Но вы получите предупреждение от использования raw types. Мне не совсем ясно, что ваш код должен сделать для меня, чтобы сказать, является ли это точной конверсией и как избежать использования необработанных типов.

В противном случае существует no way to do arithmetic generically.

+1

Ничего себе, ваша строка для строки была именно то, что мне нужно. Несмотря на мои плохие объяснения, вы сумели это исправить, я бы дал вам тысячу upvotes, если бы мог. – logos

+1

Однако определенно прочитайте Q & A, с которым я связан, на сырых типах. Рассмотрим рефакторинг таким образом, чтобы вы не использовали их. (Но raw Comparable не так плох, как некоторые другие необработанные типы: объявление compareTo должно заставить его сразу же исключить исключение, вместо того, чтобы разрешать загрязнение кучи. В рамках коллекций используются необработанные Comparables за кулисами ...) – Radiodef

1

В Java генераторы используются только во время компиляции, чтобы гарантировать правильность типа. Для ваших целей я предлагаю вам выполнить две функции: один для целых и один для поплавков

+0

То, что я думал, но моя проектная команда не согласна.Я отредактировал свой пост, чтобы показать свою реализацию того, что вы предлагаете. – logos

+0

Слишком плохо для вашей команды, нет другого пути. –

Смежные вопросы