package com.cp.javapractice;
import java.util.ArrayList;
import java.util.Scanner;
public class Cp {
public static void main(String args[]) {
ArrayList al = new ArrayList();
Scanner s = new Scanner(System.in);
String str = null;
str = new String();
System.out.println("Enter the string which you want to remove the duplicates");
str = s.nextLine();
String arr[] = str.split(" ");
for (int k = 0; k < arr.length; k++) {
al.add(arr[k]);
}
try {
for (int i = 0; i < arr.length; i++) {
for (int j = i + 1; j < arr.length; j++) {
if (arr[i].equalsIgnoreCase(arr[j])) {
al.remove(j);
}
}
}
System.out.println(al);
}
catch (Exception e) {
System.out.println(e);
}
}
}
我将替换用户特定字符串中的重复单词。因此,我使用split方法将给定的字符串与空格分开并放入数组和arraylist中。
迭代数组并检查条件是否相等然后我在ArrayList中删除了它。但删除它时显示索引超出范围。
此代码适用于较小的数组大小,但在提供大量数组大小时显示异常。 当我给出数组大小为13个单词的字符串时,我遇到了问题。
这是我的完整代码。
答案 0 :(得分:0)
for (int i = 0; i < al.size(); i++) {
for (int j = i + 1; j < al.size(); j++) {
if (al.get(i).equals(al.get(j)) {
al.remove(j);
}
}
}
答案 1 :(得分:0)
例外是因为您使用的是arr.length
而不是al.size()
。对于每次删除,arraylist al
的大小都会减小。因此,您必须考虑使用arraylist的大小而不是数组的大小。
for (int i = 0; i < al.size(); i++) { // change arr.length to al.size()
for (int j = i + 1; j < al.size(); j++) { // change arr.length to al.size()
if (arr[i].equalsIgnoreCase(arr[j])) {
al.remove(j);
}
}
}
我建议您查看HashSet
和TreeSet
,以减少重复删除的工作量。
在HashSet
中实施:
import java.util.Arrays;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
public class Cp {
public static void main(String args[]) {
Scanner s = new Scanner(System.in);
String str = null;
str = new String();
System.out.println("Enter the string which you want to remove the duplicates");
str = s.nextLine();
String arr[] = str.split(" ");
Set<String> ts = new HashSet<String>(Arrays.asList(arr)); // -> added only this line
System.out.println(ts);
}
}
答案 2 :(得分:0)
问题是你的第二个循环。是从i + 1开始。但我是从0到长度-1。所以Last ein将是j = length-1 + 1,超出了数组长度。
所以将第一个for循环更改为:
for(int i=0;i < arr.length-2;i++)