当前位置: 首页 > 面试题库 >

比较两个集合,比较两个文本文件的添加,删除和修改

汤跃
2023-03-14
问题内容

我有以下两个收藏夹,其中包含学生证。

id是格式为111-1111的字符串。例如ID 221-2534、215-6365等。

 Collection<String> newKeys = new ArrayList<String>();
 Collection<String> oldKeys = new ArrayList<String>();

这些ID与其他数据一起位于固定格式的文件中。也就是说,前8个字符ID,后10个字符名称,后10个字符地址,依此类推。

我将id读入集合,如下所示:

String oldFile = "C:\\oldFile.dat";
String newFile = "C:\\newFile.dat";
BufferedReader in;
String str;
// Read keys from old file
in = new BufferedReader(new FileReader(oldFile));
while ((str = in.readLine()) != null) {
      oldKeys.add(str.substring(0, 8).trim());
}
in.close();

// Read keys from new file
in = new BufferedReader(new FileReader(newFile));
while ((str = in.readLine()) != null) {
    newKeys.add(str.substring(0, 8).trim());
}
in.close();

此处,文件中的条目按SSN排序。因此,我相信所形成的集合也将得到排序。

现在:

案例: 我想通过比较两个集合来了解差异作为结果列表。那就是我需要的列表,其中包含添加的条目,删除的条目和相同的条目。

然后,我将使用具有公共条目的列表从两个文件中读取相应的数据,并将其进行比较以进行任何修改。

那就是我有了共同的清单之后

a)
从列表中获取一个ID。从两个文件中读取该ID的对应数据为String。比较字符串是否有任何差异。如果有所不同,请将newFile字符串移动到fileWithUpdates中。

b) 在没有差异的情况下什么也不做。

问题:

1) 这是正确的方法吗?

2) 以及如何比较两个集合以获得结果列表。toBeDeleted,toBeAdded和sameEntries?

3) 如何从键上的文件中读取特定行(在这种情况下为学生ID)?

更新:

根据以下答案,添加以下代码:

Iterator<String> iOld = oldKeys.iterator();
    Iterator<String> iNew = newKeys.iterator();
    Map<String, String> tempMap = new HashMap<String, String>();

    while (iOld.hasNext()) {
        tempMap.put(iOld.next(), "old");
    }

    while (iNew.hasNext()) {
        String temp = iNew.next();
        if (tempMap.containsKey(temp)) {
            tempMap.put(temp, "both");
        }

        else {
            System.out.println("here");
            tempMap.put(temp, "new");
        }
    }

所以现在我有一张地图了:

要比较的 条目 上图中值为“两者”的条目

要添加的 条目 上图中值为“新”的条目

要删除的 条目 上图中值为“旧”的条目

所以我的问题归结为:

如何从密钥上的文件中读取特定行,以便我可以比较它们以进行数据修改?

谢谢阅读!


问题答案:

总体而言,我认为这不是正确的方法。与其将所有信息存储在单个String中,不如创建一个对象,其中包含用于存储您需要存储的各种内容的字段。

public Student {
   String id; //or int, or char[8]
   String firstName, lastName;
   String address;
  //and so on

  //constructor - Given a line of input from the data file, create a Student object
  public Student(String line) {
     id = line.substring(0,8);
     //and so on

  }

至于比较这两个集合,让我们将它们都声明为ArrayLists,然后跟踪它们共同点的索引

ArrayList<String> newKeys = new ArrayList<>();  //java 7 syntax
ArrayList<String> oldKeys = new ArrayList<>();
//store keys from files.

TreeMap<Integer, Integer> commonKeys = new TreeMap<Integer, Integer>();
//stores the index values from newList as keys that get mapped to the old list index.

ArrayList<Integer> removedKeys =ArrayList<>();  
// Store the indices from oldKeys that are not in newKeys.

int newListIndex = 0;
int oldListIndex = 0;
while(newListIndex < newKeys.size() && oldListIndex<oldKeys.size()) {
   if(newKeys.get(newListIndex).equals(oldKeys.get(oldListIndex) ) {
      commonKeys.put(newListIndex,oldListIndex);
      oldListIndex++; newListIndex++ 
   }
   else if(newKeys.get(newListIndex).compareTo(oldKeys.get(oldListIndex)>0 ) {
      removedKeys.add(oldListIndex);
      oldListIndex++
   }
   else {
      //maybe this is a newListIndex that is not in the old list, so it was added.
      newListIndex++;
   }
}

您将需要稍微调整上面的代码以使其失效保护。另一种方法是使用包含方法,如下所示:

for(int i=0; i<oldKeys.size(); i++) {
   String oldKey = oldKeys.get(i);
   if(newKeys.contians(oldKey);
       commonKeys.put(newKeys.indexOf(oldKey) , i);
   else
       removedKeys.add(i);

}


 类似资料:
  • 问题内容: 当给出两套时 s1 = {a,b,c,d} s2 = {b,c,d,a} (IE) 如何编写Sql查询以显示“ tableA和tableB中的元素相等”。[不使用SP或UDF] 输出 问题答案: 使用: 测试:

  • 我在Visual Studio中看到了新的比较工具 有没有一种方法,我可以只是比较两个文件与内置的功能在Visual

  • 问题内容: 简单的问题。 我有一个新列表和一个旧列表。在Java中,有没有一种标准的方法/库可以比较这两个列表,并确定哪些项目已被更新/删除或是全新的?例如,我应该以三个列表结束- 删除的项目(旧项目而不是新项目),更新的项目(两个项目都在),新项目(新项目而不是旧项目)。 我可以自己写这个,但是想知道是否有标准的方法可以做到。 列表中的对象实现正确。 问题答案: 没有标准的方法对不起。您可以使用

  • 我想从Solution Explorer中选择两个C#代码文件进行文本比较。我的机器上安装了WinMerge,它在命令行上接受多个文件名。所以我试着用Openwith。。。命令并将WinMerge添加到现有选项列表中。但问题是我不知道在Arguments文本框中写什么。将其设置为%1只需将第一个选定的文件发送到WinMerge即可。%VS无法识别2,并将其粘贴到WinMerge中。 发送两个文件的

  • 我是Android Studio的新手,你能帮我吗?从下面的片段代码,我试着比较两个文本,其中一个是来自按钮,在点击test_ans按钮后,将转到'true'activity,如果他们是相同的。但不幸的是该应用程序被停止了:( 我试过delete@override public void onClick(View View),getText()变成红色,是onClick出了问题吗?请帮忙;(

  • 有两个叫做“a.txt”和“b.txt”的文件都有单词列表。现在我想检查哪些单词在“a.txt”中是额外的,而不是在“b.txt”中。 我需要一个有效的算法,因为我需要比较两个字典。