【问题标题】:Java adding unique values to hashmap <string, string>Java 向 hashmap <string, string> 添加唯一值
【发布时间】:2018-04-12 07:17:09
【问题描述】:

我制作了一个 java 程序,它将检查目录的内容并为每个文件生成一个 md5 校验和。程序完成后,会将其保存为 CSV 文件。到目前为止,文件查找工作正常,除了在写入 CSV 时我只想添加新检测到的文件。我认为问题在于未正确找到用作密钥的 md5 字符串。 以下是 CSV 文件的摘录:

4d1954a6d4e99cacc57beef94c80f994,uiautomationcoreapi.h;E:\Tools\Strawberry-perl-5.24.1.1-64\c\x86_64-w64-mingw32\include\uiautomationcoreapi.h;N/A 56ab7135e96627b90afca89199f2c708,winerror.h;E:\Tools\Strawberry-perl-5.24.1.1-64\c\x86_64-w64-mingw32\include\winerror.h;N/A 146e5c5e51cc51ecf8d5cd5a6fbfc0a1,msimcsdk.h;E:\Tools\Strawberry-perl-5.24.1.1-64\c\x86_64-w64-mingw32\include\msimcsdk.h;N/A e0c43f92a1e89ddfdc2d1493fe179646,X509.pm;E:\Tools\Strawberry-perl-5.24.1.1-64\perl\vendor\lib\Crypt\OpenSSL\X509.pm;N/A 如您所见,首先是 MD5 作为键,然后是一个包含名称、位置和分数的长字符串,将与 ;字符。

下面是确保只添加新代码的代码:

private static HashMap<String, String> map = new HashMap<String,String>(); 
public void UpdateCSV(HashMap<String, String> filemap) {
    /*Set set = filemap.entrySet();
    Iterator iterator = set.iterator();
    while(iterator.hasNext()) {
        Map.Entry mentry = (Map.Entry) iterator.next();
        String md = map.get(mentry.getKey());
        System.out.println("checking key:" + md);
        if (md == null) {
            String[] line = mentry.getValue().toString().split(";");
            System.out.println("Adding new File:" + line[0]);
            map.put(mentry.getKey().toString(), mentry.getValue().toString());
        }
    }*/
    for (final String key : filemap.keySet()) {
        String md = map.get(key.toCharArray());
        if (md == null) {
            System.out.println("Key was not found:" + key);
            String[] line = filemap.get(key).toString().split(";");
            System.out.println("Adding new File:" + line[0]);
            map.put(key, filemap.get(key));
        }
    }
}

正如您从注释代码中看到的那样,我已经以不同的方式尝试过。 hashmap filemap 是文件夹结构的当前状态。

要读取已保存的 CSV 文件,请使用以下代码:

private void readCSV() {
    System.out.println("Reading CSV file");
    BufferedReader br = new BufferedReader(filereader);
    String line =  null;
    try {
        while ((line = br.readLine()) != null) {
            String str[] = line.split(",");
            for (int i = 0; i < str.length; i++) {
                String arr[] = str[i].split(":");
                map.put(arr[0], arr[1]);
                System.out.println("just added to map" + arr[0].toString() + " with value "+ arr[0].toString() );
            }
        }
    }
    catch(java.io.IOException e) {
        System.out.println("Can't read file");
    }
}

所以当我运行程序时,它会说所有文件都是新文件,即使它们在 CSV 中已经知道。那么任何人都可以帮助正确检查此密钥字符串吗?

【问题讨论】:

  • 您有一个包含String 对象作为键的映射,您检查它是否包含char[] 类型的键。除了null,您还期待什么结果?还使用containsKey 过度检查get 以返回null。
  • 另外你为什么使用Map 来跟踪密钥? Set 就可以了。

标签: java string csv hashmap


【解决方案1】:

正如@Ben 指出的那样,您的问题是您在推杆时使用String 作为键,但在获取时使用char[]

应该是这样的:

for (final String key : filemap.keySet()) {
    map.computeIfAbsent(key, k -> {
        System.out.println("Key was not found:" + k);
        String[] line = filemap.get(k).toString().split(";");
        System.out.println("Adding new File:" + line[0]);
        return filemap.get(k);
    });
}

由于您需要来自filemap 的键和值,实际上您最好迭代entrySet。这将为您节省额外的filemap.gets:

for (final Map.Entry<String, String> entry : filemap.entrySet()) {
    final String key = entry.getKey();
    final String value = entry.getValue();
    map.computeIfAbsent(key, k -> {
        System.out.println("Key was not found:" + k);
        String[] line = value.split(";");
        System.out.println("Adding new File:" + line[0]);
        return value;
    });
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-22
    • 2012-05-26
    • 1970-01-01
    • 1970-01-01
    • 2011-12-11
    • 2017-08-30
    • 1970-01-01
    相关资源
    最近更新 更多