java通过原生类实现Hash查询
一、说在前面
首先先感谢一下为我答疑解惑的博客:https://www.cnblogs.com/shoulinniao/p/11966194.html
在设计数据结构出题系统的过程中对文件内容的查改删遇到了一些问题,于是想要通过hash这个桥梁来解决一下问题,过程中主要学习了一下博主前面部分的方法以及在java中hash的实现方式。
二、编程思路
用到hash表的原因是我想要实现对文件中信息实现删改查,所以想要通过hash这一个中间桥梁来实现这一功能。初步想法是将文件中的数据按照格式读入存进hash表中,然后按照要求查找通过hash自带的方法来对存进去的数据进行操作。
查:直接调用hash的containsKey()来查找
删:先将文件中的数据全部读入hash表,用remove()来删除之后将文件清空,再将hash表中的数据写回文件。(方法可能比较笨,希望读者如果有更好的建议可以提出来我们一起交流)
改:和删类似,先查到想要改的数据,直接加入hash表中,然后清空文件再写入。
多次的清空文件需要操作的数据量相对而言比较大,方法效率肯定不是最高的,同样如果写入途中系统出问题会造成数据丢失,所以虽然实现了功能,但是系统还是有漏洞的。
三、实现过程
class DataMap extends HashMap { public void put(long i, String str) { put(String.valueOf(i).toString(), str); } public void remove(long i) { remove(String.valueOf(i).toString().toString()); } public String get(long i) { String s = String.valueOf(i).toString(); if (!containsKey(s)) { System.err.println("没有找到相关信息" + s); } return (String) get(s); } }
public void deleteDate(long deleteNumber) throws IOException, FileNotFoundException { isDelete = true; try { DataMap mp = new DataMap(); long j = 0; String s1 = "", s2 = "", s3 = ""; BufferedReader in = new BufferedReader(new FileReader("../Title/Suanfashejidata.txt")); while ((s1 = in.readLine()) != null) { j = numberTokenizer(s1); mp.put(j, s1); } try { if (mp.containsKey(String.valueOf(deleteNumber).toString())) { mp.remove(deleteNumber); } else { throw new NumberNotFoundException(); } Collection c = mp.values(); Iterator iter = c.iterator(); while (iter.hasNext()) { s1 = (String) iter.next(); s3 += s1 + "\n"; } BufferedReader in2 = new BufferedReader(new StringReader(s3)); PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("../Title/Suanfashejidata.txt"))); while ((s1 = in2.readLine()) != null) { out.println(s1); } out.close(); } catch (NumberNotFoundException e) { isDelete = false; System.out.println(deleteNumber + "没有找到"); } } catch (IOException e) { } }
public void findDate(long find) throws IOException, NumberNotFoundException { isFind = true; String s = "", findString = ""; long i; DataMap dm = new DataMap(); BufferedReader in = new BufferedReader(new FileReader("../Title/Suanfashejidata.txt")); while ((s = in.readLine()) != null) { i = numberTokenizer(s); dm.put(i, s); } try { if (dm.containsKey(String.valueOf(find).toString())) { findString = dm.get(find); System.out.println("题目编号" + find + "题目信息:"); System.out.println(findString); } else throw new NumberNotFoundException(); } catch (NumberNotFoundException e) { System.out.println(find + "没有找到相关信息"); isFind = false; } }
public void rewrite() throws IOException, NumberNotFoundException { try { System.out.println("请输入你要修改的题目编号:"); BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); String inputLine = in.readLine(); long num = Integer.valueOf(inputLine).longValue(); findDate(num); if (isFind) { deleteDate(num); System.out.println("请重新输入该号码"); String str = inputDate(); addDate(str); System.out.println("修改成功"); } } catch (IOException e) { } catch (NumberNotFoundException e) { } }