简体   繁体   English

映射字符串数组

[英]Mapping a string arrays

    private Map<String, String> readFile(String file) throws IOException{
        FileReader fr = null;
        Map<String, String> m = new HashMap<String, String>();
        try {
        fr = new FileReader(file); 
        BufferedReader br = new BufferedReader(fr);

        String s = br.readLine();
        String[] split = s.split(";");
        for (int j = 0; j < split.length; j++ ) { //Just a temporary solution.
            m.put(split[j], split[(j+=1)]); //inserts username and password from file
        } 
        br.close();
        }
        catch (FileNotFoundException e){
            System.out.format("%s not found.%n", file);
            System.exit(1);
        }
        fr.close();

        return m;
    }

file input is -> hahaha; 文件输入是-> haha​​ha; password; 密码; I used a delimiter to split the line into two tokens which are "hahaha" and "password". 我使用了一个定界符将行分成两个标记“ haha​​ha”和“ password”。 My question is how do I map my username and password into a HashMap with my password corresponds to my username if I have more lines in my .txt file. 我的问题是,如果我的.txt文件中有更多行,我该如何将我的用户名和密码映射到HashMap中,而我的密码对应于我的用户名。

while the buffered reader has more lines: 而缓冲的阅读器有更多行:

while ((line = br.readLine()) != null) {
   // process the line.
}

You would need to loop here: 您需要在这里循环:

while ((s = br.readLine()) != null) {
   String[] split = s.split(";");
   for (int j = 0; j < split.length; j++) { 
    m.put(split[j], split[(j += 1)]);
  }
}

You could try this: 您可以尝试以下方法:

BufferedReader br = new BufferedReader(fr);

String s = br.readLine();
while( s != null) {
    String[] split = s.split(";");
    m.put(split[0], split[1]);
    s = br.readLine();
}
br.close();

And I strongly suggest using IOUtils for file operations... 我强烈建议使用IOUtils进行文件操作...

Most of this has been done by previous answers as well. 多数情况也是通过先前的答案完成的。

I suggest using LinkedHashMap to keep the input order whenever possible and use Reader for API params to avoid duplicating code as soon as files are not enough. 我建议尽可能使用LinkedHashMap保持输入顺序,并使用Reader for API params避免在文件不足时立即复制代码。

And the regex used in split is somewhat less constraining (strips spaces around ';') 而且在split中使用的正则表达式的约束较少(在';'周围带空格)

public class ParseLogin {

    /**
     * Parses lines of username password pairs delimited by ';' and returns a Map
     * username->password.
     *
     * @param reader source to parse
     * @return Map of username->password pairs.
     * @throws IOException if the reader throws one while reading.
     */
    public static Map<String, String> parse(Reader reader) throws IOException {

        Map<String, String> result = new LinkedHashMap<String, String>();
        BufferedReader br = new BufferedReader(reader);
        String line;
        while (null != (line = br.readLine())) {
            String fields[] = line.split("\\s*;\\s*");
            if (fields.length > 1) {
                result.put(fields[0], fields[1]);
            } // else ignore (or throw Exception)
        }
        return result;
    }


    public static void main(String[] args) {

        try {
            Map<String, String> result = parse(new FileReader(args[0]));
        } catch (FileNotFoundException e) {
            System.out.format("%s not found.\n", args[0]);
            System.exit(1);
        } catch (IOException e) {
            System.out.format("Error while reading from %s.\n", args[0]);
            e.printStackTrace();
            System.exit(2);
        }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM