通用置换功能元素比较会导致编译器错误

时间:2020-04-03 06:18:47

标签: java generics permutation

我试图创建一个通用的next_permutation()函数,该函数与C ++ next_permutation()函数的作用相同。编译器说:

二进制运算符'>'和'<'的错误操作数类型,

在以下行:

  • 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 个答案:

答案 0 :(得分:2)

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 :(得分:1)

如果T未执行或无法按照this的建议实施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;
}

侧面说明:您可以创建一个null友好的合作伙伴。例如:
Comparator<T> nullSafeComperator = Comparator.nullsFirst(comperator);