Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在数据结构中对特定元素进行排序——这是一种更有效的方法吗?_Java - Fatal编程技术网

Java 在数据结构中对特定元素进行排序——这是一种更有效的方法吗?

Java 在数据结构中对特定元素进行排序——这是一种更有效的方法吗?,java,Java,我正在对.csv文件中的某些元素组进行排序。我的程序有效。然而 我正在寻求关于如何提高我所写程序效率的建议。我不寻求对我的代码进行审查。我也不是要求别人为我写代码。我所要问的是:“有没有更有效的方法?如果有,是什么?” 我有一个程序,可以获取多个.csv文件,修改它们并添加额外的数据。然后保存这些文件。以下是输入数据的响应: ISBN, Shop, Cost, ReviewScore, 9780008305796, A Bookshop, 11.99, 4.8, 9781787460966, 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不是按任何列排序的

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

  • 将csv加载到字符串[][]
  • 遍历字符串[],创建一个映射:k=ISBN,v=该ISBN的发生次数
  • 遍历字符串[][] 3.1从地图中获取ISBN值,然后保存包含该ISBN的每一行(达到该值时停止) 3.2然后对保存行的价格和审核进行排序,并将行保存到另一个var中。 3.3删除密钥 3.4回到3。直到没有钥匙
  • 保存到.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);
      }
    
    
    Map dataStore=newhashmap();
    forEach(行:行){
    IsbnData datum=dataStore.get(行[0]);//或ISBN的任何索引
    如果(基准==null){
    数据=createIsbnDataFromRow(行);
    }否则{
    datum=更新后的数据(数据,行);
    }
    dataStore.put(第[0]行,数据);
    }
    
    这样做的主要好处是,您不必处理
    String[]
    ,而是拥有结构良好的类,代码更易于阅读


    代码/可能/运行得更快,但这可能无关紧要,因为它更有可能在速度重要之前耗尽内存。(不要将此与程序的速度慢混淆-它可能很慢,但这是由于读取/解析CSV文件。在解析CSV文件后,通过较少次数传递这些文件而获得的速度增益是可以忽略的)。

    数据帧库似乎非常适合此类型的任务。你试过使用一个吗?你能解释一下等级是如何计算的吗?如果你想让我们提高你程序的效率,看看你到目前为止有什么可能会有所帮助。你有工作计划吗?您是否有指标可以告诉您在哪里花费的时间最多?您优化的目的是什么?速度记忆?通常,唯一真正重要的优化是使代码更容易理解。Java会因此受到相当大的惩罚,因为您经常需要创建临时对象。正如@greenmaveguy所建议的,您可能想要尝试Python的熊猫库之类的东西。逻辑是:构建表->按ISBN分组->聚合。通常更容易理解。你好@绿衣人。我没有尝试在Java中使用dataframe库,我在python中使用Pandas的能力有限。我现在正在调查。谢谢你@Matthew。我花了一段时间去做(学习新事物,例如我从未见过或使用过地图)。我确实认为这是一个更好的方法。我还注意到你的评论“不要混淆…是可忽略的”,这是我在编码时会用到的。