Java LinkedHashSet似乎留下了一个重复的元素
我很好奇是否有人知道为什么LinkHashSet中的第一个元素似乎允许重复?我正在对CodeEval进行代码挑战,当我输入值2、2、3、3、4、4、5、5、6时,程序的输出显示2、2、3、4、5、6,这只是导致问题的第一个元素 我正在使用jre 1.8.045。我厌倦了解决这个问题,并检查了挑战,网站接受了我的解决方案,所以我想知道我的Java版本中是否有bug。我搜索过,没有看到任何人在LinkHashSet生成重复项方面有问题的帖子Java LinkedHashSet似乎留下了一个重复的元素,java,Java,我很好奇是否有人知道为什么LinkHashSet中的第一个元素似乎允许重复?我正在对CodeEval进行代码挑战,当我输入值2、2、3、3、4、4、5、5、6时,程序的输出显示2、2、3、4、5、6,这只是导致问题的第一个元素 我正在使用jre 1.8.045。我厌倦了解决这个问题,并检查了挑战,网站接受了我的解决方案,所以我想知道我的Java版本中是否有bug。我搜索过,没有看到任何人在LinkHashSet生成重复项方面有问题的帖子 import java.util.Arrays; impo
import java.util.Arrays;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Scanner;
import java.util.Set;
public class UniqueElements
{
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
String line = s.nextLine();
List<String> list = Arrays.asList(line.trim().split(","));
Set<String> string = new LinkedHashSet<>(list);
Iterator<String> iter = string.iterator();
while (true)
{
System.out.print(iter.next());
if (iter.hasNext()) {
System.out.print(",");
} else {
System.out.println();
break;
}
}
}
}
导入java.util.array;
导入java.util.Iterator;
导入java.util.LinkedHashSet;
导入java.util.List;
导入java.util.Scanner;
导入java.util.Set;
公共类单元
{
公共静态void main(字符串[]args){
扫描仪s=新的扫描仪(System.in);
字符串行=s.nextLine();
List List=Arrays.asList(line.trim().split(“,”);
Set string=newlinkedhashset(列表);
迭代器iter=string.Iterator();
while(true)
{
System.out.print(iter.next());
if(iter.hasNext()){
系统输出打印(“,”);
}否则{
System.out.println();
打破
}
}
}
}
您的问题在于:
List<String> list = Arrays.asList(line.trim().split(","));
List List=Arrays.asList(line.trim().split(“,”);
它创建一个列表,其中第一个元素是“2”
,第二个元素是“2”
(注意前导空格)
您需要在“”、“
或“”\\s*、\\s*”
上删除输入或拆分中的空格,以便在逗号前后留出空格。您的问题在于:
List<String> list = Arrays.asList(line.trim().split(","));
List List=Arrays.asList(line.trim().split(“,”);
它创建一个列表,其中第一个元素是“2”
,第二个元素是“2”
(注意前导空格)
您需要从输入中删除空格或在“
”、“
或“”\\s*、\\s*”
上拆分空格,以便在逗号前后留出空格。您明智地使用了trim()
方法,但列表项之间没有得到所有空格。您是否注意到输出列表中的数字之间有空格,但您的输出println
没有插入任何空格
第一个“2”没有前导空格。第二个“2”有一个前导空格。这使得它们不同于字符串。摆脱空间,摆脱问题
在split()
上使用不同的正则表达式会有所帮助。.split(“,\\s*”)
怎么样
另一个选项:首先为什么要使用String
值?如果它们都是数字并且保证是数字(挑战会说明这一点),那么转换为数字(或者甚至整数,如果这是保证的话)将使多余的空格变得无关。您明智地使用了trim()
方法,但是您并没有从列表条目之间获得所有的空白。您是否注意到输出列表中的数字之间有空格,但您的输出println
没有插入任何空格
第一个“2”没有前导空格。第二个“2”有一个前导空格。这使得它们不同于字符串。摆脱空间,摆脱问题
在split()
上使用不同的正则表达式会有所帮助。.split(“,\\s*”)
怎么样
另一个选项:首先为什么要使用String
值?如果它们都是数字并且保证是这样的(挑战会说明这一点),那么转换成数字(或者甚至整数,如果这是保证的话)将使无关的空格变得不相关。似乎不会重现,尽管有奇怪的循环。数组.asList(line.trim().split(“,”)
:此处的逻辑错误trim()
仅删除整行的前导空格和尾随空格,而不是单个数字。因此,您的集合包含两个字符串2
和2
,这两个元素是唯一的。尽管存在奇怪的循环,但它们似乎没有复制。Arrays.asList(line.trim().split(,”)
:您的逻辑在这里是错误的trim()
仅删除整行的前导空格和尾随空格,而不是单个数字。因此,您的集合包含字符串2
和2
,这两个元素是唯一的。谢谢,在拆分中添加“\\s*,\\s*”修复了问题。谢谢,在拆分中添加“\\s*,\\s*”修复了问题。