如何检查重复的数字并按照读取的相同顺序打印出读取的输入数字(不包括所有重复项。)
How to check duplicate numbers and print out the read input numbers in the same order that they were read (excluding all duplicates.)
我正在尝试编写代码。在那里我将从用户那里获得最多 1000 个(整数)输入(它必须是数组[1000])并且它会按照写入时的相同顺序打印出整数。
如果用户需要,可以按 ctrl+z 停止阅读。该程序不会写出重复的数字。
示例;
输入:45 77 -22 3 45 0 21 -1 3
输出:45 77 -22 3 0 21 -1
到目前为止我已经编码(2 天内):
static int i = 0;
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int[] array = new int[1000];
int[] arrayCopy = new int[1000];
int k=0,j=0;
System.out.println("enter your integer numbers");
while(input.hasNext())
{
array[i] = input.nextInt();
for(j =0 ; j< array.length; j++)
{
arrayCopy[j] = array[j];
}
for( k =1; k<arrayCopy.length; k++)
{
int aV = arrayCopy[k];
}
i++;
}
input.close();
}
}
使用集合代替数组。设置不会添加重复项。
使用 HashMap 来跟踪已经看到的数字。如果它是一个新数字,则仅将其添加到您的输出字符串中。您可以使用以下内容修改您的代码:
int[] array = new int[1000];
Scanner input = new Scanner(System.in);
int index = 0;
while(input.hasNext()) {
array[index] = input.nextInt();
index++;
}
HashMap<Integer, Boolean> seenNumbers = new HashMap<Integer, Boolean>();
String result = "";
for (int i = 0; i < index; i++) {
int value = array[i];
if (!seenNumbers.containsKey(value)) {
result += " " + value;
seenNumbers.put(value, true);
}
}
System.out.println(result);
对我来说最简单的解决方案是使用 LinkedHashSet - 不允许重复并保留插入顺序
Set <Integer> set = new LinkedHashSet<>(1000);
while (input.hasNext()) {
int next = input.nextInt();
set.add(next);
}
input.close();
for (Integer number : set) {
System.out.print(number+" ");}
应该可以
前提是您可以解决排序顺序,并使用数组:
下面是伪代码和数据。它被写成数组,但您可以始终在需要的地方循环。我写的数据也不带逗号,因为这是我的语言 Dyalog APL 输出的内容 ;-),但下面的数据只是 9 元素一维数组。结果似乎包含 7 个元素。
你有
A = 45 77 -22 3 45 0 21 -1 3
解决A的升序排序问题:
order = 3 8 6 4 9 7 1 5 2 // A[3] is smallest, then A[8], A[6], etc.
写入:
B = A[order] // B now holds: -22 -1 0 3 3 21 45 45 77
遍历 B 中除了第一个元素之外的所有元素,检查下一个元素是否与当前元素相同。将结果写入C,这是一个等长的零向量,但是C的第一个元素必须是1:
C = 1 0 0 0 0 0 0 0 0
s = 2
:While (s <= [length of C])
C[s] = (B[s-1] == B[s]) // C[s] is 0 or 1
s += 1
:End
现在 C 持有:
1 1 1 1 0 1 1 1 0
创建一个空变量 D(或者只是从 A 或 B 复制 - 您将覆盖它):
D = A
将D的元素赋值如下:
D[order] = C // D now holds: 1 1 1 1 0 1 1 1 0
只取 A 的 D 元素(你选择 A 的元素并将它们附加到结果,结果最初是空的——即长度为零):
s = 1
:While (s <= [lenght of A])
:if D[s] // Means: If (D[s] == 1)
[append A[s] to Result]
s += 1
:End
:End
结果现在包含
45 77 -22 3 0 21 -1
我正在尝试编写代码。在那里我将从用户那里获得最多 1000 个(整数)输入(它必须是数组[1000])并且它会按照写入时的相同顺序打印出整数。
如果用户需要,可以按 ctrl+z 停止阅读。该程序不会写出重复的数字。
示例;
输入:45 77 -22 3 45 0 21 -1 3 输出:45 77 -22 3 0 21 -1
到目前为止我已经编码(2 天内):
static int i = 0;
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int[] array = new int[1000];
int[] arrayCopy = new int[1000];
int k=0,j=0;
System.out.println("enter your integer numbers");
while(input.hasNext())
{
array[i] = input.nextInt();
for(j =0 ; j< array.length; j++)
{
arrayCopy[j] = array[j];
}
for( k =1; k<arrayCopy.length; k++)
{
int aV = arrayCopy[k];
}
i++;
}
input.close();
}
}
使用集合代替数组。设置不会添加重复项。
使用 HashMap 来跟踪已经看到的数字。如果它是一个新数字,则仅将其添加到您的输出字符串中。您可以使用以下内容修改您的代码:
int[] array = new int[1000];
Scanner input = new Scanner(System.in);
int index = 0;
while(input.hasNext()) {
array[index] = input.nextInt();
index++;
}
HashMap<Integer, Boolean> seenNumbers = new HashMap<Integer, Boolean>();
String result = "";
for (int i = 0; i < index; i++) {
int value = array[i];
if (!seenNumbers.containsKey(value)) {
result += " " + value;
seenNumbers.put(value, true);
}
}
System.out.println(result);
对我来说最简单的解决方案是使用 LinkedHashSet - 不允许重复并保留插入顺序
Set <Integer> set = new LinkedHashSet<>(1000);
while (input.hasNext()) {
int next = input.nextInt();
set.add(next);
}
input.close();
for (Integer number : set) {
System.out.print(number+" ");}
应该可以
前提是您可以解决排序顺序,并使用数组:
下面是伪代码和数据。它被写成数组,但您可以始终在需要的地方循环。我写的数据也不带逗号,因为这是我的语言 Dyalog APL 输出的内容 ;-),但下面的数据只是 9 元素一维数组。结果似乎包含 7 个元素。
你有
A = 45 77 -22 3 45 0 21 -1 3
解决A的升序排序问题:
order = 3 8 6 4 9 7 1 5 2 // A[3] is smallest, then A[8], A[6], etc.
写入:
B = A[order] // B now holds: -22 -1 0 3 3 21 45 45 77
遍历 B 中除了第一个元素之外的所有元素,检查下一个元素是否与当前元素相同。将结果写入C,这是一个等长的零向量,但是C的第一个元素必须是1:
C = 1 0 0 0 0 0 0 0 0
s = 2
:While (s <= [length of C])
C[s] = (B[s-1] == B[s]) // C[s] is 0 or 1
s += 1
:End
现在 C 持有:
1 1 1 1 0 1 1 1 0
创建一个空变量 D(或者只是从 A 或 B 复制 - 您将覆盖它):
D = A
将D的元素赋值如下:
D[order] = C // D now holds: 1 1 1 1 0 1 1 1 0
只取 A 的 D 元素(你选择 A 的元素并将它们附加到结果,结果最初是空的——即长度为零):
s = 1
:While (s <= [lenght of A])
:if D[s] // Means: If (D[s] == 1)
[append A[s] to Result]
s += 1
:End
:End
结果现在包含
45 77 -22 3 0 21 -1