繁体   English   中英

对数据结构中的特定元素进行排名 - 是一种更有效的方法吗?

[英]Ranking specific elements within a data structure - is the a more efficient way?

我正在对 a.csv 文件中的某些元素组进行排名。 我的程序有效。 然而...

我正在就如何提高我编写的程序的效率寻求建议。 我不寻求对我的代码进行审查。 堆栈溢出参考 我也没有要求有人为我编写代码。 我要问的是:“有没有更有效的方法?如果有呢?”

我有一个程序需要多个.csv 文件,修改它们并添加额外的数据。 然后保存这些文件。 下面是输入数据的表示:

ISBN, Shop, Cost, ReviewScore,
9780008305796, A Bookshop, 11.99, 4.8,
9781787460966, A Bookshop, 6.99, 4.3,
9781787460966, Lots of books, 5.99, 4.4,
9781838770013, A Bookshop, 6.99, 3.8,
9780008305796, The bookseller, 13.99, 4.7,
9780008305796, Lots of books, 16.99, 4.1,

注意:每个.csv 文件通常有 1000 行长。 一个 ISBN 可能有 1 到 20 个实例。 .csv 未按任何列排序。

我的程序工作如下(伪代码):

  1. 将 csv 加载到 String[][]
  2. 遍历 String[][] 以创建 map:其中 k = ISBN,v = 该 ISBN 的出现次数
  3. 遍历 String[][] 3.1 从 map 获取 ISBN 值,然后保存具有该 ISBN 的每一行(达到值时停止) 3.2 然后对已保存行的价格和评论进行排名,并将这些行保存到另一个变量中。 3.3 删除密钥 3.4 go 回到 3. 直到没有密钥
  4. 存入.csv

数据现在看起来像:

ISBN, Shop, Cost, ReviewScore, CostRank, ReviewRank
9780008305796, A Bookshop, 11.99, 4.8, 1, 1
9781787460966, A Bookshop, 6.99, 4.3, 2, 2
9781787460966, Lots of books, 5.99, 4.4, 1, 1
9781838770013, A Bookshop, 6.99, 3.8, 1, 1
9780008305796, The bookseller, 13.99, 4.1, 2, 3
9780008305796, Lots of books, 16.99, 4.3, 3, 2

该程序不依赖于.csv 加载到的数据结构的类型。 它可以是列表、列表列表、集合等。

你/可以/一次性完成,代码看起来像这样:

  Map<String, IsbnData> dataStore = new HashMap();
  forEach(row : rows) {
     IsbnData datum = dataStore.get(row[0]); //or whatever the index of ISBN is
     if(datum == null) {
        datum = createIsbnDataFromRow(row);
     } else {
        datum = updateDatumWithMoreData(datum, row);
     }

     dataStore.put(row[0], datum);
  }

这样做的主要好处是,您不必处理String[] ,而是拥有结构良好的类,并且代码更易于阅读。

代码/可能/运行得更快,但这可能无关紧要,因为在速度重要之前它更有可能用完 memory。 (不要将此与程序速度慢混淆 - 它可能很慢,但这是由于读取/解析 CSV 文件。通过 CSV 文件在解析它们后的速度增益可以忽略不计) .

暂无
暂无

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

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