Сортировать список в Dart не так же, как отсортированный список в Swift - PullRequest
0 голосов
/ 20 января 2019

Я успешно реализовал алгоритм сортировки в Swift для iOS.(см. код ниже).

Теперь я хотел бы реализовать тот же алгоритм в Dart for Flutter.

И я должен был понять, что мое испытание (см. ниже) не делает то же самоекак код Swift.Почему ????

Кто-нибудь может объяснить разницу между функцией sorted Свифта и функцией sort Дартса?Почему мои приведенные ниже фрагменты кода не делают то же самое в Swift и Dart ???

Вот код Swift:

return stationItems.sorted {
    let nameA = $0.name!
        .replacingOccurrences(of: ",", with: "", options: .literal, range: nil)
        .replacingOccurrences(of: "ä", with: "a", options: .literal, range: nil)
        .replacingOccurrences(of: "ö", with: "o", options: .literal, range: nil)
        .replacingOccurrences(of: "ü", with: "u", options: .literal, range: nil)
        .lowercased()
    let nameB = $1.name!
        .replacingOccurrences(of: ",", with: "", options: .literal, range: nil)
        .replacingOccurrences(of: "ä", with: "a", options: .literal, range: nil)
        .replacingOccurrences(of: "ö", with: "o", options: .literal, range: nil)
        .replacingOccurrences(of: "ü", with: "u", options: .literal, range: nil)
        .lowercased()
    let searchTermy = searchTerm
        .replacingOccurrences(of: ",", with: "", options: .literal, range: nil)
        .replacingOccurrences(of: "ä", with: "a", options: .literal, range: nil)
        .replacingOccurrences(of: "ö", with: "o", options: .literal, range: nil)
        .replacingOccurrences(of: "ü", with: "u", options: .literal, range: nil)
        .lowercased()

    if nameA == searchTermy && nameB != searchTermy {
        return true
    } else if nameA.hasPrefix(searchTermy) && !nameB.hasPrefix(searchTermy)  {
        return true
    } else if nameA.contains(searchTermy) && !nameB.contains(searchTermy) {
        return true
    } else {
        let n = searchTermy.count
        for i in 0..<searchTermy.count {
            if nameA.hasPrefix(String(searchTermy[..<(n-i)])) && !nameB.hasPrefix(String(searchTermy[..<(n-i)])) {
                return true
            } else {
                return false
            }
        }
        return false
    }
}

Вот код Dart:

return stationList.sort((a, b) {
   var nameA = a.stopName
      .replaceAll(RegExp(','), '')
      .replaceAll(RegExp('ä'), 'a')
      .replaceAll(RegExp('ö'), 'o')
      .replaceAll(RegExp('ü'), 'u')
      .toLowerCase();
   var nameB = b.stopName
      .replaceAll(RegExp(','), '')
      .replaceAll(RegExp('ä'), 'a')
      .replaceAll(RegExp('ö'), 'o')
      .replaceAll(RegExp('ü'), 'u')
      .toLowerCase();
   var searchTermy = stationName
      .replaceAll(RegExp(','), '')
      .replaceAll(RegExp('ä'), 'a')
      .replaceAll(RegExp('ö'), 'o')
      .replaceAll(RegExp('ü'), 'u')
      .toLowerCase();
   if ((nameA == searchTermy) && (nameB != searchTermy)) {
      return 1;
   } else if (nameA.startsWith(searchTermy) && !nameB.startsWith(searchTermy)) {
      return 1;
   } else if (nameA.contains(searchTermy) && !nameB.contains(searchTermy)) {
      return 1;
   } else {
      var n = searchTermy.length;
      for (int i = 0; i < searchTermy.length; i++) {
        if (nameA.startsWith(searchTermy.substring(0, (n - i))) && !nameB.startsWith(searchTermy.substring(0, (n - i)))) {
          return 1;
       } else {
          return 0;
       }
     }
     return 0;
   }
});

1 Ответ

0 голосов
/ 20 января 2019

true / false отличается от 0/1 здесь.

Сортировка дротиков проверяет 3 разные вещи.

В сравнении между A и B у нас есть 3 возможности:

  • Обратный вызов возвращает 0.В этом случае A и B равны
  • Обратный вызов возвращает число > 0.Это означает, что A ставится после B
  • . Обратный вызов возвращает число < 0.В этом случае A ставится перед B.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...