【问题标题】:What is the smartest way to find the larger / smaller of two numbers找到两个数字中较大/较小的最聪明的方法是什么
【发布时间】:2016-04-27 08:02:43
【问题描述】:

寻找最聪明、最有效和最易读的方法来执行以下操作:

int one = 1, two = 2;
int larger = one < two?two:one;

我更喜欢(或下面的可变参数版本):

int largest(one,two){return one<two?two:one;}
int larger = largest(one,two);

但 dart 没有内联或宏。

有列表:

var nums = [51,4,6,8];
nums.sort();
in largest = nums.last

或者(谢谢你,Günter Zöchbauer):

print([1,2,8,6].reduce(max));

使用数学库:

import 'dart:math';
int largest = max(21,56);

可能是最好的,但与第一种方法相比,最大效率如何?

为什么要问这个问题?
使用第一种方法,我必须检查每个比较是否正确;有时有数百个。用第二种,只验证一个函数,却调用了数百个函数。

【问题讨论】:

标签: dart


【解决方案1】:

我很确定

import 'dart:math';
int largest = max(21,56);

是最好的方法。它足够小,可以被编译器(dart2js,VM)内联,这对读者来说是最不意外的。对于自定义实现,读者必须调查该函数以确定它的作用。

对于值的集合,我发现这是最优雅的方式

来自https://stackoverflow.com/a/20490970/217408

import 'dart:math';

main(){
  print([1,2,8,6].reduce(max)); // 8
  print([1,2,8,6].reduce(min)); // 1
}

为了得到最小值/最大值而对列表进行重新排序是非常低效的

var nums = [51,4,6,8];
nums.sort();
in largest = nums.last

【讨论】:

  • 唯一需要注意的是,来自dart:mathminmax 仅在数字上定义。考虑到它们处理 min(0.0, -0.0) -> -0.0 并在任一值为 NaN 时返回 NaN,它们在这些方面非常有效。我怀疑它们和a&lt;b?a:b 一样快,但实际上在我确定它是我的程序的瓶颈之前,我不会优化它。
猜你喜欢
  • 2019-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-07
  • 1970-01-01
  • 1970-01-01
  • 2012-03-15
  • 1970-01-01
相关资源
最近更新 更多