删除字符串数组中的重复字符
Removing duplicate characters in a String array
我有一个像 [q w e r r t] 这样的示例输入,我想删除重复项并使用数组打印 [q w e r t]。我不明白为什么下面的代码片段的输出不同。
for(int j=0; j< array.length; j++) {
for(int k=j+1; k< array.length; k++) {
if(array[j] == array[k]) {
continue;
}
System.out.print(array[j] + " ");
j = k;
}
}
更新:我想将此逻辑用于排序数组。我使用了 Arrays.sort()。我将 == 更改为 .equals() for Strings.
public static void main(String args[]) throws IOException {
// Enter size of array and assert the type of input
System.out.println("Enter size of array in integers");
Scanner sc = new Scanner(System.in);
while (!sc.hasNextInt()) {
System.out.println("Please enter integers");
sc.next();
}
;
// Accepting the values into the array and sorting them
int demoInt = sc.nextInt();
String[] array = new String[demoInt];
String[] outputMarkers = new String[demoInt];
System.out.println("Enter the values");
for (int i = 0; i < array.length; i++) {
Scanner scNum = new Scanner(System.in);
array[i] = scNum.next();
if (i == array.length - 1) System.out.println("Array is full");
}
Arrays.sort(array);
System.out.printf("Sorted array is : %s", Arrays.toString(array));
//Checking for duplicates //Sample: a a a s d f
for (int j = 0; j < array.length; j++) {
for (int k = j + 1; k < array.length; k++) {
if (array[j].equals(array[k])) {
continue; //returns to for loop with increment
}
System.out.print(array[j] + ". ");
j = k;
}
}
}
输入:a a d f
输出:a d f
为什么不只使用一个循环?
//assuming array has length >= 2
System.out.print(array[0] + " ");
for(int j=1; j< array.length; j++) {
if(array[j] == array[j - 1]) {
continue;
}
System.out.print(array[j] + " ");
}
如果您希望删除值而不是在打印时跳过它们,您将希望从数组的末尾开始并向 0 移动,当您找到时调用 array.remove(i)与先前检查的对象匹配的对象。
虽然那只是作为循环练习来做。将数组推入集合会更容易。
你的问题是你正在检查每个字符和它后面的所有字符。想象一个没有重复的数组;一旦你到达最后一个字符,你就打印出了它之前的所有字符。但是当 j = array.length - 1
,然后 k = array.length
,第二个 for
循环根本不会 运行,你的最后一个字符将永远不会被打印出来。
您的代码总是无法正确打印最后一个元素。唯一正确的情况是你的最后一个元素是前一个元素的副本,而不是倒数第二个元素的副本。
试试这个代码:
outerloop:
for (int j = 0; j < array.length; j++) {
for(int k = 0; k < j; k++) {
if(array[j] == array[k]) {
continue outerloop;
}
}
System.out.print(array[j] + " ");
}
代码的前提是循环遍历每个字符。如果它与前面的任何字符匹配,代码将跳过该元素并继续到下一个。
编辑:您似乎编辑了排序数组的问题。这意味着如果最后一个元素是重复的,它将是它之前元素的重复,因此我们不必担心我之前代码块中的极端情况。
for(int j=0; j< array.length; j++) {
for(int k=j+1; k< array.length; k++) {
if(array[j] == array[k]) {
continue;
}
System.out.print(array[j] + " ");
j = k;
}
}
System.out.print(array[array.length-1] + " ");
可以使用大小为122的布尔数组,使数组中的所有值都为假,迭代给定的字符数组,如果字符的ASCII值为假,则使之为真并打印。
下面是示例代码,这里我取了一个字符串并删除了所有重复项并打印了结果字符串:
static String removeDuplicate(String s) {
boolean[] flagArr = new boolean[122];
int sLength = s.length();
StringBuilder resultStr = new StringBuilder();
for (int i = 0; i < sLength; i++) {
char tempChar = s.charAt(i);
int tempVal = (int) tempChar;
if (!flagArr[tempVal]) {
flagArr[tempVal] = true;
resultStr.append(tempChar);
}
}
return resultStr.toString();
}
完整代码在
Removing Duplicate Characters From String Without Using Set | jain Tarun Blog
我有一个像 [q w e r r t] 这样的示例输入,我想删除重复项并使用数组打印 [q w e r t]。我不明白为什么下面的代码片段的输出不同。
for(int j=0; j< array.length; j++) {
for(int k=j+1; k< array.length; k++) {
if(array[j] == array[k]) {
continue;
}
System.out.print(array[j] + " ");
j = k;
}
}
更新:我想将此逻辑用于排序数组。我使用了 Arrays.sort()。我将 == 更改为 .equals() for Strings.
public static void main(String args[]) throws IOException {
// Enter size of array and assert the type of input
System.out.println("Enter size of array in integers");
Scanner sc = new Scanner(System.in);
while (!sc.hasNextInt()) {
System.out.println("Please enter integers");
sc.next();
}
;
// Accepting the values into the array and sorting them
int demoInt = sc.nextInt();
String[] array = new String[demoInt];
String[] outputMarkers = new String[demoInt];
System.out.println("Enter the values");
for (int i = 0; i < array.length; i++) {
Scanner scNum = new Scanner(System.in);
array[i] = scNum.next();
if (i == array.length - 1) System.out.println("Array is full");
}
Arrays.sort(array);
System.out.printf("Sorted array is : %s", Arrays.toString(array));
//Checking for duplicates //Sample: a a a s d f
for (int j = 0; j < array.length; j++) {
for (int k = j + 1; k < array.length; k++) {
if (array[j].equals(array[k])) {
continue; //returns to for loop with increment
}
System.out.print(array[j] + ". ");
j = k;
}
}
}
输入:a a d f 输出:a d f
为什么不只使用一个循环?
//assuming array has length >= 2
System.out.print(array[0] + " ");
for(int j=1; j< array.length; j++) {
if(array[j] == array[j - 1]) {
continue;
}
System.out.print(array[j] + " ");
}
如果您希望删除值而不是在打印时跳过它们,您将希望从数组的末尾开始并向 0 移动,当您找到时调用 array.remove(i)与先前检查的对象匹配的对象。
虽然那只是作为循环练习来做。将数组推入集合会更容易。
你的问题是你正在检查每个字符和它后面的所有字符。想象一个没有重复的数组;一旦你到达最后一个字符,你就打印出了它之前的所有字符。但是当 j = array.length - 1
,然后 k = array.length
,第二个 for
循环根本不会 运行,你的最后一个字符将永远不会被打印出来。
您的代码总是无法正确打印最后一个元素。唯一正确的情况是你的最后一个元素是前一个元素的副本,而不是倒数第二个元素的副本。
试试这个代码:
outerloop:
for (int j = 0; j < array.length; j++) {
for(int k = 0; k < j; k++) {
if(array[j] == array[k]) {
continue outerloop;
}
}
System.out.print(array[j] + " ");
}
代码的前提是循环遍历每个字符。如果它与前面的任何字符匹配,代码将跳过该元素并继续到下一个。
编辑:您似乎编辑了排序数组的问题。这意味着如果最后一个元素是重复的,它将是它之前元素的重复,因此我们不必担心我之前代码块中的极端情况。
for(int j=0; j< array.length; j++) {
for(int k=j+1; k< array.length; k++) {
if(array[j] == array[k]) {
continue;
}
System.out.print(array[j] + " ");
j = k;
}
}
System.out.print(array[array.length-1] + " ");
可以使用大小为122的布尔数组,使数组中的所有值都为假,迭代给定的字符数组,如果字符的ASCII值为假,则使之为真并打印。 下面是示例代码,这里我取了一个字符串并删除了所有重复项并打印了结果字符串:
static String removeDuplicate(String s) {
boolean[] flagArr = new boolean[122];
int sLength = s.length();
StringBuilder resultStr = new StringBuilder();
for (int i = 0; i < sLength; i++) {
char tempChar = s.charAt(i);
int tempVal = (int) tempChar;
if (!flagArr[tempVal]) {
flagArr[tempVal] = true;
resultStr.append(tempChar);
}
}
return resultStr.toString();
}
完整代码在
Removing Duplicate Characters From String Without Using Set | jain Tarun Blog