Сравнение элементов перестановочной функции Generi c дает ошибку компилятора - PullRequest
1 голос
/ 03 апреля 2020

Я попытался создать обобщенную функцию c next_permutation(), которая выполняла бы то же самое, что и функция C ++ next_permutation(). Компилятор говорит:

неверные типы операндов для двоичных операторов '>' и '<', </p>

в следующих строках:

  • if (data.get(last) < data.get(last + 1))
  • if (if data.get(i) > data.get(last))

Как мне решить эту проблему?

public static <T> boolean findNextPermutation(List<T> data) 
{ 


    if (data.size() <= 1) 
        return false; 

    int last = data.size() - 2; 

    while (last >= 0) { 
        if (data.get(last) < data.get(last + 1)) { 
            break; 
        } 
        last--; 
    } 

    if (last < 0) 
        return false; 

    int nextGreater = data.size() - 1; 

    for (int i = data.size() - 1; i > last; i--) { 
        if (data.get(i) > data.get(last)) { 
            nextGreater = i; 
            break; 
        } 
    } 

    data = swap(data, nextGreater, last); 

    data = reverse(data, last + 1, data.size() - 1); 

    return true; 
} 

Ответы [ 2 ]

2 голосов
/ 03 апреля 2020

T может быть чем угодно. Это может быть тип Integer или тип String. Integer можно распаковать в int и сравнить с < или >, но String не может.

Вам необходимо сузить значение T. Один из способов - заставить T реализовать Comparable. Затем вы можете использовать метод compareTo():

public static <T extends Comparable<T>> boolean findNextPermutation(List<T> data) {

  if (data.size() <= 1)
    return false;

  int last = data.size() - 2;

  while (last >= 0) {
    if (data.get(last).compareTo(data.get(last + 1)) < 0) {
      break;
    }
    last--;
  }

  if (last < 0)
    return false;

  int nextGreater = data.size() - 1;

  for (int i = data.size() - 1; i > last; i--) {
    if (data.get(i).compareTo(data.get(last)) > 0) {
      nextGreater = i;
      break;
    }
  }

  data = swap(data, nextGreater, last);

  data = reverse(data, last + 1, data.size() - 1);

  return true;
}
1 голос
/ 03 апреля 2020

Если T не реализует или не может реализовать Comparable в соответствии с предложением этого ответа, вы можете указать Comparator<T> и использовать его:

public static <T> boolean findNextPermutation(List<T> data, Comparator<T> comperator) {

      if (data.size() <= 1)  return false;

      int last = data.size() - 2;

      while (last >= 0) {
        if (comperator.compare(data.get(last),data.get(last + 1)) < 0 ){
          break;
        }
        last--;
      }

      if (last < 0) return false;

      int nextGreater = data.size() - 1;

      for (int i = data.size() - 1; i > last; i--) {
        if (comperator.compare(data.get(i), data.get(last)) > 0) {
          nextGreater = i;
          break;
        }
      }

      data = swap(data, nextGreater, last);
      data = reverse(data, last + 1, data.size() - 1);

      return true;
}

Примечание: Вы можете сделать ноль дружественного сотрудника. Например: Comparator<T> nullSafeComperator = Comparator.nullsFirst(comperator);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...