以下是我正在使用的代码段.
Scanner sc = new Scanner(System.in); int N = sc.nextInt(); ArrayListal = new ArrayList (); while (N-- > 0) { str = new StringBuffer(sc.next()); if (al.contains(str)) { System.out.println("Duplicate value " + str); } else { al.add(str); } }
如果输入是:4
ABC
FGH
DFG
ABC
当预期输出为:时显示空白输出:
重复值abc
我在哪里错了?
StringBuffer
不会覆盖Object
's equals
,所以当你搜索你是否List
包含某个StringBuffer
实例时,你正在检查确切的引用是否出现在List
.
您可以使用a HashSet
来避免重复,因为String
覆盖equals
,然后(如果必须)List
从元素创建HashSet
.
BTW,StringBuilder
效率更高StringBuffer
(只有在计划从多个线程访问它时才应该使用).
Scanner sc = new Scanner(System.in); int N = sc.nextInt(); ArrayListal = new ArrayList (); Set uniques = new HashSet<>(); while (N-- > 0) { uniques.add(sc.next()); } for (String s : uniques) al.add (new StringBuffer(s));
如果您必须报告重复项,则需要进行少量更改:
Scanner sc = new Scanner(System.in); int N = sc.nextInt(); ArrayListal = new ArrayList (); Set uniques = new HashSet<>(); while (N-- > 0) { String str = sc.next(); if (!uniques.add(str)) System.out.println("Duplicate value " + str); } for (String s : uniques) al.add (new StringBuffer(s));