在Dart中升序和降序排序?

时间:2015-01-12 08:32:52

标签: sorting dart

我有这个

var nlist = [4,2,1,5];
var compare = (a, b) => a.compareTo(b);
nlist.sort(compare);
print(nlist);        // [1,2,4,5]

和此处(我将(b, a)更改为(a, b)

var nlist = [4,2,1,5]
var compare = (b, a) => a.compareTo(b);
nlist.sort(compare);
print(nlist);        // [5,4,2,1]

为什么这个小修改会从升序变为降序?

6 个答案:

答案 0 :(得分:7)

在改变之后你真正期望发生的事情会很有趣。

比较返回+10-1,具体取决于第二个参数是否大于第一个参数或0是否相等。交换时,+1变为-1,反之亦然,这会导致降序而不是升序。

1.compareTo(2)

返回-1

print(nlist.sort((a, b) => a.compareTo(b)));

按升序打印列表元素,所以是的,升序是默认值。

答案 1 :(得分:7)

升序

v-if=(users.Alarm)

下降

 <v-card  class="mx-4 grey darken-4" v-for="user in users" :key="user.id">

     <v-footer flat height="35px"  color="black"> 
       <v-btn class="green--text mx-1" x-small v-if="safety">Safety</v-btn> 

       <v-btn class="red--text mx-1" x-small v-if="alarm">Alarm</v-btn> 

       <v-btn class="yellow--text mx-1" x-small v-if="battery">Battery</v-btn> 

     </v-footer>
     <v-divider></v-divider>
</v-card>

export default {
  components: {  },
  data() {

    return {
      safety: false,
      battery: false,
      alarm: false,
      users: [],
    };
  },

  created() { 
    if (users.Safety) {
       this.check = true;

   }},
// here goes the other buttons once I get one working


   var user = firebase.auth().currentUser;
   var SuperUser = user.uid + "3329"

    db.collection(SuperUser)

      .get()
      .then(querySnapshot => {
        querySnapshot.forEach(doc => {
          const data = {

            id: doc.id,
            Safety: doc.data().Safety,
            Alarm: doc.data().Alarm,
            Battery: doc.data().Battery,

          };

          this.users.push(data);
        });
      })
     }
    }; 

答案 2 :(得分:2)

升序:

var nlist = [4,2,1,5]
var compare = (b, a) => a.compareTo(b);

降序:

var compare = (b, a) => -a.compareTo(b);

答案 3 :(得分:1)

另一种排序方式

  var nlist = [4,2,1,5];
  var ascending = nlist..sort();
  var descending = ascending.reversed;
  print(ascending);  // [1, 2, 4, 5]
  print(descending);  // [5, 4, 2, 1]

答案 4 :(得分:0)

使用静态扩展方法对序列进行排序

import 'package:enumerable/enumerable.dart';

void main() {
  final nlist = [4, 2, 1, 5];
  final query1 = nlist.orderBy((e) => e);
  print(query1.toList());
  final query2 = nlist.orderByDescending((e) => e);
  print(query2.toList());
}

答案 5 :(得分:0)

升序

不需要写list.sort((a, b) => a.compareTo(b));。这有效:

list.sort();

降序

list.sort((a, b) => b.compareTo(a));

或者,从 2021 年开始,如果您使用 https://pub.dev/packages/fast_immutable_collections(FIC 包),这将起作用:

list.sortReversed();

注意事项:

  • (list..sort()).reversed 不会原地反转列表。相反,它按升序对原始列表进行排序,然后返回降序的 iterable,而不是列表(即,Iterable<int>,而不是 List<int>)。也许这就是你想要的。如果没有,您必须执行list = (list..sort()).reversed.toList();。但是,对于大型列表,list.sortReversed() 要快得多。

  • 在前面提到的 FIC 包中还有一个 reversedView() 方法,它返回列表的降序 VIEW。 “视图”意味着如果您稍后将项目添加到原始列表中,反向列表也将拥有这些项目,反之亦然。因此,如果您的列表已经按升序排序,并且您想访问降序列表而不浪费时间进行反转,只需执行以下操作:

    list.sort();
    List<int> listDescending = list.reversedView; // Very fast.
    

免责声明:我是 FIC 包的作者。