java - 迭代List <map>并将Map的内容与已知数据

时间:2018-05-27 04:58:13

标签: java arrays if-statement optimization

我有一个小型的java类,它将在云应用服务器上运行,因此需要尽快执行。

我需要做的是迭代List<Map>,获取当前Map的内容,然后对其做一些逻辑。 Map包含字符串和双精度。

这是我目前的实施:

for (int i = 0; i < count; i++) {

  Map data = result.get(i);
  double priceToCheck = Double.parseDouble(data.get("value").toString());
  String criteria = data.get("criteria").toString();
  String coin = data.get("coin").toString();


  if (coin.equals("BTC")) {
    if (criteria.equals("above")) {
      if (BTC > priceToCheck) {
        // create notficaition
        sendNotification = true;

      }
    } else {
      if (BTC < priceToCheck) {
        // create notification
        sendNotification = true;
      }
    }
  } else if (coin.equals("BCH")) {
    if (criteria.equals("above")) {
      if (BCH > priceToCheck) {
        // create notficaition
        sendNotification = true;
      }
    } else {
      if (BCH < priceToCheck) {
        // create notification
        sendNotification = true;
      }
    }
  } else if (coin.equals("ETH")) {
    if (criteria.equals("above")) {
      if (ETH > priceToCheck) {
        // create notficaition
        sendNotification = true;
      }
    } else {
      if (ETH < priceToCheck) {
        // create notification
        sendNotification = true;
      }
    }
  } else if (coin.equals("ETC")) {
    if (criteria.equals("above")) {
      if (ETC > priceToCheck) {
        // create notficaition
        sendNotification = true;
      }
    } else {
      if (ETC < priceToCheck) {
        // create notification
        sendNotification = true;
      }
    }
  } else if (coin.equals("LTC")) {
    if (criteria.equals("above")) {
      if (LTC > priceToCheck) {
        // create notficaition
        sendNotification = true;
      }
    } else {
      if (LTC < priceToCheck) {
        // create notification
        sendNotification = true;
      }
    }
  } else if (coin.equals("XRP")) {
    if (criteria.equals("above")) {
      if (XRP > priceToCheck) {
        // create notficaition
        sendNotification = true;
      }
    } else {
      if (XRP < priceToCheck) {
        // create notification
        sendNotification = true;
      }
    }

  }

resultList<Map>"BTC"是字符串,BTC是双

正如您可以看到if语句检查字符串coin的最高级别,有六个可能的值。找到coin后,我会确定criteria的值,然后根据criteria

的值进行双打比较

我觉得这是完成这项任务的一种非常繁琐的方式,它可以工作但速度相对较慢。如果不直接访问每个Map元素并手动检查内容,我想不出加快速度的方法。

还有其他人有什么想法吗?

2 个答案:

答案 0 :(得分:2)

  

我有一个小型的java类,它将在云应用服务器上运行,因此需要尽快执行。

首先,那里有一些令人怀疑的假设。

  1. 是的,您的代码尽可能快地运行是很好的,但在大多数情况下并不是必需的。特别是,您在云服务器上运行的事实并不一定使其变得必不可少。

  2. 您认为您的应用程序运行速度不够快。 (你有基准吗?)

  3. 您认为代码的这一部分是(或将要)代码太慢。 (你有没有实现它?你有没有想过它?)

  4. 而且:

      

    我觉得这是完成这项任务的一种非常繁琐的方式,它可以工作但速度相对较慢。

    繁琐而缓慢并不相同。通常繁琐冗长/笨重更快而不是简洁/优雅。

    现在针对您的代码的潜在性能问题。 (请记住,这可能都与您的假设无关!)

    1. 如果字段是/可以在编译时知道,最好使用自定义类而不是MapMap::get方法比自定义类上的getter慢几个数量级,而Map通常会使用一个数量级更多的内存。

      自定义类还允许您使用原始类型等,而不是将值转换为String。避免这种情况也会带来性能上的好处。

    2. 这很慢:

      double priceToCheck = Double.parseDouble(data.get("value").toString());
      

      您似乎正在使用double(或Double, converting it to a string and then converting it back to a双倍。数字和十进制字符串之间的转换相对昂贵。

    3. 如果在编译时已知coincriteria的值,请考虑使用enumboolean而不是字符串。比较会更快,您将能够在布尔情况下使用switch语句...或简单的if

    4. 事实上,通过列表的迭代是一个方面,这不是很多优化的机会。

答案 1 :(得分:0)

这里有一个非常突出的优化。您的原始代码snippit将遍历整个列表以调整sendNotification布尔值。

如果您需要设置sendNotification,则可以在每个条件中策略性地放置break。这将在所需行为之后使回路短路。在最糟糕的情况下,您最终会遍历整个列表。

for (int i = 0; i < count; i++) {


  if (coin.equals("BTC")) {
    if (criteria.equals("above")) {
      if (BTC > priceToCheck) {
        // create notficaition
        sendNotification = true;
        break; // exits the loop

      }
    } else {
      if (BTC < priceToCheck) {
        // create notification
        sendNotification = true;
        break;
      }
   }
  } else if (coin.equals("BCH")) {
    if (criteria.equals("above")) {
      if (BCH > priceToCheck) {
        // create notficaition
        sendNotification = true;
        break;
      }