[英]How do you remove all char duplicates in a partial array(unsorted and not supposed to sort)
我正在尝试删除此部分数组中的重复项。 我试图将第 i 个元素与每个元素进行比较,但出了点问题。
public class deleteRepeats{
public static void deleteRepeats(char[] c, int size){
int i,j;
char temp;
char[] newArray = new char[size];
for(i=0;i<size;i++){
newArray[i] = c[i];
}
for(i=0;i<size;i++){
for(j=0;j<size;j++){
if(newArray[i]==newArray[j]&&i!=j){
temp = newArray[j];
for(int k=j+1;k<size;k++){
newArray[k-1] = newArray[k];
newArray[size-1] = temp;
size-=1;
}
}
}
}
for(i=0;i<size;i++){
System.out.print(newArray[i]+" ");
}
}
public static void main(String[] args){
char[] a = new char[10];
a[0] = 'a';
a[1] = 'b';
a[2] = 'a';
a[3] = 'e';
a[4] = 'b';
a[5] = 'q';
deleteRepeats(a, 6);
}
}
电流输出:aee
对于像这样的简单问题,您的代码太复杂了。 为了更快地做到这一点,请使用两个这样的循环
public static void deleteRepeats2(char[] c, int size){
int i, j, k = 0;
char[] newArray = new char[size];
for(i=0; i < size; i++){
for(j = 0; j < i; j++){
if (c[j] == c[i])
break;
}
if (j == i)
newArray[k++] = c[i];
}
for(i=0; i < k; i++){
System.out.print(newArray[i]+" ");
}
}
或者如果你想保留你的代码
public static void deleteRepeats(char[] c, int size){
int i,j;
char temp;
char[] newArray = new char[size];
for(i=0; i < size; i++){
newArray[i] = c[i];
}
for(i = 0; i < size; i++){
for(j = i + 1; j < size; j++){
if(newArray[i] == newArray[j] && i != j){
temp = newArray[j];
for(int k = j; k < size - 1; k++){
newArray[k] = newArray[k + 1];
}
newArray[size-1] = temp;
}
}
}
for(i=0;i<size;i++){
System.out.print(newArray[i]+" ");
}
}
一种方法是使用流。
char[] c = new char[10];
c[0] = 'a';
c[1] = 'b';
c[2] = 'a';
c[3] = 'e';
c[4] = 'b';
c[5] = 'q';
首先,您的方法应该返回新数组而不是更改源。 主要原因是您无法更改传递数组的大小,因此它仍将包含过程中剩余的“垃圾”。 您始终可以将方法的返回值分配给源数组。
其次,您不需要传递数组的大小。 你可以从c.length()
public static char[] deleteRepeats(char[] c) {
return Arrays.stream(String.valueOf(c).split("")).filter(
str -> str.charAt(0) != 0).distinct().collect(
Collectors.joining()).toCharArray();
}
char
数组,因此创建并拆分了一个字符串empty slots
(您的数组大小大于其内容)distinct()
方法消除了重复项。char
数组如果您更喜欢更传统的方法,则可以这样做。
public static char[] deleteRepeats(char[] c) {
StringBuilder sb = new StringBuilder();
sb.append(c[0]); // assign first character
for (char ch : c) {
if (ch == 0 || sb.indexOf(ch + "") >= 0) {
continue; // skip a 0 value or duplicates
}
sb.append(ch);
}
return sb.toString().toCharArray();
}
char[] result = deleteRepeats(c);
for (int i = 0; i < result.length; i++) {
System.out.print(result[i] + " ");
}
请记住,原始数组初始化为0
,对象数组初始化为null
。 这就是为什么必须在上面的两个示例中过滤掉 0 的原因。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.