如何使这些代码与泛型一起使用?

时间:2013-08-12 11:51:55

标签: java generics

我有一些代码只使用另一个堆栈对堆栈进行排序(这是一个面试问题)。代码本身似乎有效。我想使用泛型实现它,以便在以下条件下任何类型的堆栈都是可排序的:

  1. 排序方法保持静态(我想避免参数化整个类)
  2. 我可以使用本机比较器运算符(比如<) - 我想参数化类型需要实现Comparable
  3. 这可能吗?

    这是代码。

    import java.util.Stack;
    public class StackSort {
        static void sort(Stack<Integer> stack) {
            Stack<Integer> tmp = new Stack<Integer>();
            for (;;) {
                int nswaps = 0;
                while (!stack.isEmpty()) {
                    Integer curr = stack.pop();
                    if (!stack.isEmpty() && curr < stack.peek()) {
                        Integer next = stack.pop();
                        tmp.push(next);
                        tmp.push(curr);
                        ++nswaps;
                    } else {
                        tmp.push(curr);
                    }
                }
                while (!tmp.isEmpty()) {
                    stack.push(tmp.pop());
                }
                if (nswaps == 0) {
                    break;
                }
            }
        }
        public static void main(String[] args) {
            Stack<Integer> stack = new Stack<Integer>();
            stack.push(6);
            stack.push(4);
            stack.push(11);
            stack.push(8);
            stack.push(7);
            stack.push(3);
            stack.push(5);
            System.out.println(stack);
            StackSort.sort(stack);
            System.out.println(stack);
        }
    }
    

2 个答案:

答案 0 :(得分:3)

通过提及可比较,你是正确的。

您的方法可以

static <T extends Comparable<T>>void sort(Stack<T> stack) {

比较曲线&lt; stack.peek()替换为

curr.compareTo(stack.peek()) < 0

答案 1 :(得分:2)

在Java中不可能在Objects上使用比较器运算符(包括或不包装原语)。 C ++支持这种可能性。但是,您可以通过强制参数类型实现Comparable来创建变通方法。您的签名应如下所示:

public <T extends Comparable<? super T>> static void sort(Stack<T> stack)

要进行比较,请使用compareTo而不是本机运算符(这在Java中是不可能的):

obj1.compareTo(obj2)