我有一个文本文件,每行上都有文本,例如:
1245狗沙哑
2356猫虎斑猫
3476狗哈巴狗
为了争辩,每行重复大量种类的任意数据,大约10,000行,所以它趋于无穷大。
我有读取此数据并将其存储在对象中的代码,后面是伪代码;
Pet P;
lineInput = reader.readLine(); //where reader is reading the above mentionedfile
P.id = lineInput.split('\t')[0]
P.type = lineInput.split('\t')[1] //Assigning the parts of the line to it's relevant data members
P.breed = lineInput.split('\t')[2]
现在是问题,考虑到我需要能够尽可能快地排序,搜索和显示这些值,我不知道我的最佳选择是什么,我想出了两种可以在下面看到的方法
方法1:根据所有对象的起始ID号将它们存储在数组列表中
ArrayList<Pet> idStartsWith1;
if(P.id starts with 1)
idStartsWith1.add(P); // "1245 Dog Husky" will be added here
ArrayList<Pet> idStartsWith2;
if(P.id starts with 2)
idStartsWith2.add(P); // "2356 Cat Tabby" will be added here
ArrayList<Pet> idStartsWith3;
if(P.id starts with 3)
idStartsWith3.add(P); // "3476 Dog Pug" will be added here
我认为这将是更快的方法,因为这些数组列表已经在进程内存中,但是我担心它会使内存过载,并引起问题。 (请记住,文本文件中的行数趋于无限)
方法2:根据所有对象的起始ID号将它们写入.dat文件中
Writer writer1 = new Writer("idStartsWith1.dat"); //writer1 will write to file "idStartsWith1.dat"
if(P.id starts with 1)
writer1.write(P); // "1245 Dog Husky" will be writen to this file
Writer writer2 = new Writer("idStartsWith2.dat"); //writer2 will write to file "idStartsWith2.dat"
if(P.id starts with 2)
writer2.write(P);
Writer writer3 = new Writer("idStartsWith3.dat"); //writer3 will write to file "idStartsWith3.dat"
if(P.id starts with 3)
writer3.write(P);
这将防止进程内存过载,但是我担心每次需要搜索和显示Pet时都必须先打开,然后读取,然后关闭文件,这将大大增加运行时间。
这两种方法中哪一种会更好?还是还有像我这样的Java新手不会发生的另一种更有效的方法?
正确完成后,没有什么比使用主存储器快了。 ArrayList
不可用于搜索,但Map
可用。
您可以改用数据库,您可能应该使用。这比将所有数据都存储在主内存中要慢得多,但是假设您做得正确(了解索引等),它仍然非常快。大多数数据库可以直接导入CSV文件,并且能够回答所有查询-数据库存在的目的是过滤,排序和联接其他表。