无法输出数组列表中的差异

时间:2014-05-14 15:07:34

标签: java output bufferedreader printwriter

我似乎无法获得显示两个arraylist之间差异的输出。最初我试图读取两个文件并将新文件写入原始文件中但不能同时使用的内容,因此我尝试使用arraylist进行测试,但遇到了同样的问题。 / p>

我使用equals()方法,它可以正常搜索两个文件中的内容。只是在寻找不在两个文件中的内容时才会出现问题。

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.PrintWriter;
import java.util.ArrayList;

public static void main(String[] args) throws Exception {
    File txtFile = new File("file path goes here");

    // Contents of that text file
   /**
    *     Test1
    *     Test2
    *     Test3
    *     Test4
    *     Test5
    *     Test6
    */

    FileReader inputStream = new FileReader(txtFile);
    BufferedReader reader = new BufferedReader(inputStream);
    String input;
    ArrayList<String> list = new ArrayList<String>();
    ArrayList<String> list2 = new ArrayList<String>();

    while((input = reader.readLine()) != null) {
        list.add(input);
    }

    reader.close();
    list2.add("Test1");
    list2.add("Test4");
    list2.add("Test5");

    File newFile = new File("new file location/name");
    PrintWriter writer = new PrintWriter(newFile);

    for(int i = 0; i < list.size(); i++) {
        for(int c = 0; c < list2.size(); c++) {
            if(!list.get(i).equals(list2.get(c))) {
                writer.println(list.get(i));
            }
        }
    }
    writer.close();
}

我得到的代码输出是:

Test1
Test1
Test2
Test2
Test2
Test3
Test3
Test3
Test4
Test4
Test5
Test5
Test6
Test6
Test6

我尝试过foreach循环并在不同的地方关闭作者,但无法获得正确的输出。

输出应为:Test2,Test3,Test6

我想知道是否有人可以解释发生了什么?

4 个答案:

答案 0 :(得分:0)

尝试:

List<String> difference = new ArrayList<String>(list);
difference.removeAll(list2);

循环差异给出:“Test2”,“Test3”和“Test6”。

这是你想要的吗?

答案 1 :(得分:0)

以下代码存储 list1 file1 的内容以及 list2 file2 的内容。然后比较列表和&amp;将不常见的内容存储在新列表中然后写入 file3

引入两个新的 ArrayList 变量 tempList1 &amp;的 tempList2 即可。复制 list1 &amp;的内容 list2 分别加入其中。我们只需要从 tempList &amp;中删除相同的内容。我们最终得到两个临时列表变量,其中包含唯一元素。将 tempList2 的内容复制到 tempList1 。现在应将ArrayList tempList1 写入 file3

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.PrintWriter;
import java.util.ArrayList;

public class Test {

public static void main(String[] args) throws Exception {

    String line;

    ArrayList<String> list1 = new ArrayList<>();
    BufferedReader br1 = new BufferedReader(new FileReader("E:/file1.txt"));

    while ((line = br1.readLine()) != null) { // read lines of file1
        list1.add(line); // and store in list1
    }

    ArrayList<String> list2 = new ArrayList<>();
    BufferedReader br2 = new BufferedReader(new FileReader("E:/file2.txt"));

    while ((line = br2.readLine()) != null) { // read lines of file2
        list2.add(line); // and store in list2
    }

    list1 = compare(list1, list2);

    PrintWriter writer = new PrintWriter("E:/file3.txt");
    writer.write(list1.toString()); // writing desired output in file3
    writer.close();

}// END of main

// This method compare both list & return a new list with uncommon elements.
public static ArrayList<String> compare(ArrayList<String> list1,
        ArrayList<String> list2) {

    // we're going to remove matched elements while comparison.
    // That's why, we'll create copy of list1 & list2

    ArrayList<String> tempList1 = new ArrayList<>();
    tempList1.addAll(list1);
    ArrayList<String> tempList2 = new ArrayList<>();
    tempList2.addAll(list2);

    // Iterate & remove common elements
    for (String a : list1) {
        for (String b : list2) {
            if (a.equals(b)) {
                tempList1.remove(b);
                tempList2.remove(b);
            }
        }
    }
    // all common elements have been removed. both tempList has unique elements

    tempList1.addAll(tempList2);
    return tempList1;

}// END of compare()
}

答案 2 :(得分:-1)

问题在于这一部分:

for(int i = 0; i < list.size(); i++) {
    for(int c = 0; c < list2.size(); c++) {
        if(!list.get(i).equals(list2.get(c))) {
            writer.println(list.get(i));
        }
    }
 }

您访问第一个元素的第二个列表中的每个元素。 相反它应该是:

for(int i = 0; i < list.size(); i++) {
    boolean found = false;
    for(int c = 0; c < list2.size(); c++) {
        if(list.get(i).equals(list2.get(c))) {
            found = true;
            break;
        }
    }

    if(!found) {
        writer.println(list.get(i));
    }
 }

编辑:它还取决于你想要实现的目标,这会打印出第一个列表中不在第二个列表中但不是相反的每个元素。

答案 3 :(得分:-1)

使用.equalsIgnoreCase("String");