1

我想知道为什么这段代码会出现编译错误。我是 JAVA 的新手。我想像在 C++ 中一样制作一组对内部类代码中的对是什么意思

import java.io.*;
import java.util.Set;

public class UVa {
    public static boolean flag = false;
    public static Integer p0, p1;
    public static Set<pair<Integer,Integer> > sorter;

    public static class pair<first,second>{
        public first First;
        public second Second;
        private pair(first First,second Second){
            this.First = First;
            this.Second = Second;
        }
    }

    public static void main(String[] args) {
        try {
            while (true) {
                p0 = System.in.read();
                p1 = System.in.read();
                sorter.add(pair<p0, p1>); //<<Syntax error on token ">", Expression expected after this token

            }
        } catch (IOException e) {
            System.out.println(e.toString());
        }
    }
}
4

7 回答 7

5

看来您正在尝试构建一个新的pair使用

pair<p0, p1>

但是,正确的语法是

new pair<Integer, Integer>(p0, p1)
于 2012-08-03T09:50:34.030 回答
3

您要添加到 Set 的是 type 的对象pair<Integer, Integer>。要创建其中之一,您需要使用new关键字,并使用两个 Integer 变量p0和调用构造函数p1

sorter.add(new pair<Integer, Integer>(p0,p1));

以大写字母命名类是传统的做法。我在下面用这些约定重写了你的类,以尝试更清楚地pair展示它如何使用Java 泛型:

public static class Pair<T1,T2>{
    public T1 first;
    public T2 second;
    private pair(T1 first, T2 second){
        this.first = first;
        this.second = second;
    }
}
于 2012-08-03T09:59:18.897 回答
2

在第 8 行:

public static Set<pair<Integer,Integer> > sorter;

Set 尚未初始化,这就是抛出的原因java.lang.NullPointerException ,因此,您必须首先像下面一样初始化它。

public static Set<pair<Integer,Integer> > sorter = new HashSet<UVa.pair<Integer,Integer>>();

在第 25 行,
您尝试pair<p0, p1>像您正在做的那样添加设置

 sorter.add(pair<p0, p1>); 

但它不是正确的语法。正确的语法是 .

sorter.add(new pair<Integer, Integer>(p0, p1));

或者

sorter.add(new pair(p0, p1))
于 2012-08-03T09:53:51.143 回答
1

更改了您的代码:

 pair p= new pair<Integer, Integer>(p0, p1);
            sorter.add(p); //<<Syntax error on token ">", Expression expected after this token
于 2012-08-03T09:52:22.203 回答
0

不应该

sorter.add(pair<p0, p1>);

sorter.add(new pair(p0, p1));
于 2012-08-03T09:51:13.257 回答
0

在您的来源pair<p0, p1>中,声明sorter.add(pair<p0, p1>);中指的是 type pair。您实际上并没有创建要添加到集合中的对象。你还不如写sorter.add(int);

于 2012-08-03T09:51:41.900 回答
0

欢迎来到 Java。虽然 Java 是 C++,但编程风格略有不同。试试下面的。开始pair编译只是你的第一个问题。;)

public class UVa {
    public static void main(String... args) {
        Scanner scanner = new Scanner(System.in);

        List<Pair<Integer, Integer>> sorter = new ArrayList<>();
        while (scanner.hasNext()) {
            int p0 = scanner.nextInt();
            int p1 = scanner.nextInt();
            sorter.add(Pair.of(p0, p1));
            scanner.nextLine();
        }

        Collections.sort(sorter, new Comparator<Pair<Integer, Integer>>() {
            @Override
            public int compare(Pair<Integer, Integer> o1, Pair<Integer, Integer> o2) {
                int cmp = Integer.compare(o1.first, o2.first);
                if (cmp == 0)
                    cmp = Integer.compare(o1.second, o2.second);
                return cmp;
            }
        });
        for (Pair<Integer, Integer> pair : sorter) {
            System.out.println(pair);
        }
    }
}

class Pair<First, Second> {
    public final First first;
    public final Second second;

    public Pair(First first, Second second) {
        this.first = first;
        this.second = second;
    }

    public static Pair<Integer, Integer> of(int i, int j) {
        return new Pair<Integer, Integer>(i, j);
    }

    @Override
    public String toString() {
        return "Pair{" +
                "first=" + first +
                ", second=" + second +
                '}';
    }
}
于 2012-08-03T10:01:22.963 回答