public class Pascal {
public static void main(String[] args){
int array[] = {1,2,3,3,4,5,6,6,7,8,8,10,10,11,12,13};
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array.length; j++) {
if (i == j){
System.out.println(i);
} else {
System.out.println("Nothing");
}
}
}
}
}
它无法正常工作。我尝试使用foreach
循环,但它不起作用。我认为这几乎已经完成,我错过了一些微不足道的事情。
答案 0 :(得分:2)
您的问题
i
而不是array[i]
。 这样可以工作,但它仍会打印几次重复值:
int array[] = {1,2,3,3,4,5,6,6,7,8,8,10,10,11,12,13,13};
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array.length; j++) {
if (array[i] == array[j] && i != j){
System.out.println(array[i]);
}
}
}
现在,我向您展示了解决此问题的不同风格。
在命令式风格中提供更好的解决方案。
您正在解析数组n
次,这是无用的。如果数组已排序(您可以对其进行排序),您可以将元素与下一个元素进行比较,就像在此解决方案中一样:
int array[] = {1,2,3,3,4,5,6,6,7,8,8,10,10,11,12,13};
//Optionally
Arrays.sort(array);
Integer last = null;
for(int i = 0; i < array.length -1 ; i++) {
if(array[i] == array[i+1] && (last == null || !last.equals(array[i]))) {
System.out.println(array[i]);
last = array[i];
}
}
我认为这是最有效的解决方案,但不是最易读的。
使用foreach循环的另一种解决方案
除非你明确需要访问当前元素的索引,否则使用普通的旧for
循环是邪恶的,因为它引入了不必要的变量i
,这会污染代码的可读性。
您可以更喜欢使用foreach语句:
int array[] = {1,2,3,3,3,4,5,6,6,7,8,8,10,10,11,12,13,13};
Set<Integer> uniqueValues = new HashSet<>();
Set<Integer> alreadyDisplayed = new HashSet<>();
for(Integer value : array) {
if(uniqueValues.contains(value) && !alreadyDisplayed.contains(value)) {
System.out.println(value);
alreadyDisplayed.add(value);
}
uniqueValues.add(value);
}
功能风格的更好解决方案。
此解决方案更符合Java8:
int array[] = {1,2,3,3,4,5,6,6,7,8,8,10,10,11,12,13};
//Count occurrences of each number
Map<Integer, Integer> map = new HashMap<>();
Arrays.stream(array).forEach(value -> {
Integer occurrences = map.get(value);
map.put(value, occurrences == null ? 1 : occurrences +1);
});
//Display number of occurrences when nbOccurrences > 1
map.entrySet()
.stream()
.filter(entry -> entry.getValue() > 1)
.forEach(entry -> System.out.println(entry.getKey() + " : "+entry.getValue()));
请注意,它还会给出每个值的出现次数。如果您不需要它们,可以像以前的解决方案一样缩短代码。
逻辑风格的更有趣的解决方案。
Integer array[] = {1,2,3,3,4,5,6,6,7,8,8,10,10,11,12,13};
//Convert the array to a list.
List<Integer> list = Arrays.stream(array).collect(Collectors.toList());
//Use a Set in order to build the collection of unique values.
Set<Integer> uniqueValues = new HashSet<>(list);
//Remove each unique value once from the original list.
uniqueValues.stream().forEach(list::remove);
//Re-compute unique values of the resulting list and display them.
new HashSet<>(list).forEach(System.out::println);
答案 1 :(得分:1)
将“if(i == j)”替换为“if(array [i] == array [j])”
答案 2 :(得分:1)
首先,您应该将array [i]与array [j]进行比较,而不是将i与j进行比较。
其次,如果我= = j,你就不应该将一个元素与自身进行比较。
例如:
for (int i = 0; i < array.length; i++) {
for (int j = i + 1; j < array.length; j++) {
if (array[i] == array[j]) {
System.out.println(array[i]);
}
}
}
这将打印重复值。
答案 3 :(得分:1)
您应该比较数组中的元素,而不是数组索引。此外,当索引相同时,数字不会重复,它只是相同的数字。
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array.length; j++) {
if ((array[i] == array[j]) && (i != j)) {
System.out.println(array[i]);
}
}
}
答案 4 :(得分:1)
如果您想使用更多空间来创建Set
对象
Set<Integer> set = new HashSet<Integer>;
for (int i = 0; i < array.length; i++) {
boolean wasAdded = set.add(i);
if(!wasAdded){
System.out.println(array[i]);
}
}
答案 5 :(得分:0)
你正在使用暴力方法来做到这一点。
for (int i = 0; i < array.length; i++) {
for (int j = i+1; j < array.length; j++) {
if (array[i] == array[j]){
System.out.println(i);
} else {
System.out.println("Nothing");
}
}
}
}
答案 6 :(得分:0)
另一种可能性是使用Map
来准确计算所有条目:
public class Pascal {
public static void main(String[] args) {
int array[] = { 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 8, 10, 10, 11, 12, 13 };
Map<Integer, Integer> lAllDoubleEntries = new HashMap<Integer, Integer>();
for (int i = 0; i < array.length; i++) {
Integer count = lAllDoubleEntries.get(array[i]);
if (null == count) {
lAllDoubleEntries.put(array[i], 1);
} else {
lAllDoubleEntries.put(array[i], ++count);
}
}
for (int lKey : lAllDoubleEntries.keySet()) {
if (lAllDoubleEntries.get(lKey)>1) {
System.out.println("Value "+lKey+" exists in list "+lAllDoubleEntries.get(lKey)+" times");
}
}
}
}
输出:
值3存在于列表中2次
值2存在于列表中2次
值8存在于列表中2次
值10存在于列表中2次
答案 7 :(得分:0)
使用Set。
的解决方案不包含重复元素的集合。更正式地说,集合不包含元素e1和e2对,例如e1.equals(e2),最多只有一个null元素。
int[] myArr = {1,2,3,3,4,5,6,6,7,8,8,10,10,11,12,13};
Set<Integer> mySet = new HashSet<>();
for (int i = 0; i < myArr.length; i++) {
if (!mySet.add(myArr[i])) {
System.out.println(myArr[i]);
}
}
答案 8 :(得分:0)
Algo解释duplicate-entries-with-4kb-constraint-bit-array-is-the-solution
public static void main(String args []){
int input [] = new int [/ *选择一个大小 /];
input [0] = / 填充数组* /
int [] isDuplicate = new int [32000&gt;&gt; 5]; //除以32
int wordNumber,mask;
for(int i = 0; i < input.length; i++ ){
mask = 1 << (input[i]%32);
wordNumber = input[i]/32;
if((mask & isDuplicate[wordNumber]) != 0){
System.out.println(input[i]);
}else{
isDuplicate[wordNumber] |= mask;
}
}
}