[英]Remove duplicates from java list without using sets
Java初学者,所以请忍受可能愚蠢的问题。
我有一个包含多个重复项的字符串列表,我想检测并删除这些重复项。 我知道有一种使用HashSet进行此操作的简单方法,实际上我已经使它像这样工作。 但是最初,我试图以另一种方式(也很简单)来执行此操作,其中出了点问题,但我不知道这是什么。
给定一个包含重复项的字符串数组,例如{“ A”,“ B”,“ C”,“ A”},我可以检测并替换重复项(此处为“ A”)。 但是,如果我有一个包含多个重复项的字符串数组,例如{“ A”,“ B”,“ C”,“ A”,“ E”,“ A”}},则方法“ replaceDuplicate”中的循环中会出问题()”。
我需要帮助以了解以下代码中的问题所在:
public class TryTask_B2_Vector {
public static void main(String[] args) {
// Create array of strings for all the 'Gars':
String[] garList = new String[] {"A", "B", "C", "A", "E", "A"};
// Display the original "ArrayList" of 'Gars':
System.out.println("Original list of Gars: " + garList);
System.out.println();
bruteForce(garList);
System.out.println(bruteForce(garList));
System.out.println();
replaceDuplicate(garList);
System.out.println();
bruteForce(garList);
System.out.println(bruteForce(garList));
System.out.println();
System.out.println("New list of Gars: " + garList);
}
public static boolean bruteForce(String[] input){
for(int i=0; i < input.length; i++){
for(int j=0; j < input.length; j++){
if(input[i].equals(input[j]) && i != j){
return true;
}
}
}
return false;
}
public static String[] replaceDuplicate(String[] input){
for(int i=0; i < input.length; i++){
for(int j=0; j < input.length; j++){
if(input[i].equals(input[j]) && i != j){
input[j] = input[j].replace(input[j], "null");
System.out.println(input[j]);
}
}
}
return input;
}
}
该程序运行良好,并用字符串“ null”替换了重复项。 因此{ "A", "B", "C", "A", "E", "A" }
将为[A, B, C, null, E, null]
。 打印输出语句中有两个令人困惑的位。 第二个bruteForce()
方法仍然返回true,指出仍然存在重复项。 实际上,该重复值是字符串“ null”。 其次是多个空打印输出。 在replaceDuplicate()
您首先将值设置为“ null”,然后进行打印,该打印将始终打印为null。
还有一点。 j
的内部循环不必从0开始。我们只需要在ahaead中查找重复项即可。 因此for (int j = i+1; j < input.length; j++)
它可以从(i + 1)开始。 节省了一些额外的循环,您可以避免执行i != j
检查。
像修改你的程序
import java.util.Arrays;
public class TryTask_B2_Vector {
public static void main(String[] args) {
// Create array of strings for all the 'Gars':
String[] garList = new String[] { "A", "B", "C", "A", "E", "A" };
// Display the original "ArrayList" of 'Gars':
System.out.println("Original list of Gars: " + Arrays.toString(garList));
System.out.println();
bruteForce(garList);
System.out.println("Has duplicates : " + bruteForce(garList));
System.out.println();
replaceDuplicate(garList);
System.out.println();
bruteForce(garList);
System.out.println("Has duplicates : " + bruteForce(garList));
System.out.println();
System.out.println("New list of Gars: " + Arrays.toString(garList));
}
public static boolean bruteForce(String[] input) {
for (int i = 0; i < input.length; i++) {
for (int j = i+1; j < input.length; j++) {
if (!"null".equals(input[i]) && input[i].equals(input[j])) {
return true;
}
}
}
return false;
}
public static String[] replaceDuplicate(String[] input) {
for (int i = 0; i < input.length; i++) {
for (int j = i+1; j < input.length; j++) {
if (!"null".equals(input[i]) && input[i].equals(input[j])) {
System.out.println("Duplicate found : " + input[j]);
input[j] = input[j].replace(input[j], "null");
}
}
}
return input;
}
}
问题出在您的bruteforce
方法中。 删除所有重复项后,您期望它返回false
,但事实并非如此。 您的replace method
可以正常工作,并将String null
出现在重复项A出现的地方。 它要放入多个String null
(每个额外的'A'一个),因此,您的bruteforce方法仍然会看到重复项并仍然返回true
。 只需添加
if(!input[i].equals("null"))
对于您的蛮力方法,应该没问题
可能需要进行一些修改,但是:
@Test
public void test(){
String[] garList = new String[] {"A", "B", "C", "A", "E", "A"};
//remove duplicates
String[] noDup = new String[garList.length];
for(int i =0; i<garList.length; i++){
if(!contains(noDup, garList[i])){
noDup[i] = garList[i];
}
}
System.out.println(Arrays.toString(noDup));
// move nulls to the end
String[] tailNull = new String[garList.length];
int j = 0;
for (int i = 0; i < noDup.length; i++) {
if(noDup[i]!=null){
tailNull[j] = noDup[i];
j++;
}
}
System.out.println(Arrays.toString(tailNull) + "/" + j);
// copy range of not null elements
String[] noNull = new String[j];
System.arraycopy(tailNull, 0, noNull, 0, j);
System.out.println(Arrays.toString(noNull));
}
boolean contains(String[] array, String o){
for (int i = 0; i < array.length; i++) {
if(o.equals(array[i]))
return true;
}
return false;
}
删除重复项和重复的null。
通过使用2种方法,我们可以从java..ie 1.中的列表对象中删除重复元素。 每个使用
ArrayList<String> wordDulicate = new ArrayList<String>();
ArrayList<String> tempList= new ArrayList<String>();
wordDulicate.add("Tom");
wordDulicate.add("Jones");
wordDulicate.add("Sam");
for (String dupWord : wordDulicate) {
if (!tempList.contains(dupWord)) {
tempList.add(dupWord);
}
}
2.通过使用迭代器
ArrayList l1 = new ArrayList();
ArrayList l2 = new ArrayList();
Iterator iterator = l1.iterator();
while (iterator.hasNext())
{
YourClass o = (YourClass) iterador.next();
if(!l2.contains(o)) l2.add(o);
}
就像你喜欢答案一样打...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.