Может ли кто-нибудь оптимизировать этот код в dart. Я делал фильтр поиска для каждого слова - PullRequest
1 голос
/ 20 июня 2020

Мне нужно добавить фильтры поиска для firebase, чтобы я мог легко и точно получать результаты поиска

Я менял код отсюда This Medium Post

void main() {
  print(setSearchParam("Dr apj abdul Kalam"));
}

setSearchParam(String caseNumber) {
  List<String> caseSearchList = List();
  String temp = "";
  String temp2 = "";
  String temp3 = "";

  if (caseNumber.split(" ").length > 1) {
    String firstWord = caseNumber.split(" ")[0];
    String secondWord = caseNumber.split(" ")[1];
    String thirdWord = caseNumber.split(" ")[2];

    for (int i = 0; i < firstWord.length; i++) {
      temp = temp + firstWord[i];
      caseSearchList.add(temp);
    }
    for (int i = 0; i < secondWord.length; i++) {
      temp2 = temp2 + secondWord[i];
      caseSearchList.add(temp2);
    }
    for (int i = 0; i < thirdWord.length; i++) {
      temp3 = temp3 + thirdWord[i];
      caseSearchList.add(temp3);
    }
  } else {
    for (int i = 0; i < caseNumber.length; i++) {
      temp = temp + caseNumber[i];
      caseSearchList.add(temp);
    }
  }
  return caseSearchList;
}

OutPuts похожи на список букв каждого слова = [D, Dr, a, ap, apj, a, ab, abd, abdu, abdul]

Я подталкиваю эти списки к firebase, чтобы я мог легко получать результаты поиска ... если есть альтернатива для поиска в firebase, дайте мне знать ...

если кто-то все еще не понял мой вопрос, пожалуйста, посмотрите ссылку я предоставляю выше.

1 Ответ

1 голос
/ 20 июня 2020

Как также упоминал jamesdlin, ваш код можно значительно оптимизировать.

Я попытался сделать здесь более оптимизированную версию, которая также будет работать для строк любого размера и любого количества слов:

void main() {
  print(setSearchParam("Dr apj abdul Kalam"));
  // [D, Dr, a, ap, apj, a, ab, abd, abdu, abdul, K, Ka, Kal, Kala, Kalam]

  print(searchParamWord('test'));
}

List<String> setSearchParam(String caseNumber) =>
    caseNumber.split(' ').expand(searchParamWord).toList();

Iterable<String> searchParamWord(String word) sync* {
  final sb = StringBuffer();

  for (var i = 0; i < word.length; i++) {
    yield (sb..writeCharCode(word.codeUnitAt(i))).toString();
  }
}

Я разделил logi c вашего кода на две части.

searchParamWord берет одно слово и разбивает его на компоненты, такие как «(t, te, tes, test)» и возвращает итератор с отложенной оценкой. Позже этот итератор может быть использован expand в setSearchParam, где мы разбиваем длинный String на каждое отдельное слово.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...