[英]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.