Défi Codingbat : solution d'API de flux sumNumbers

Eugène Khlebnikov

Étant donné la tâche sumNumbers de CodingBat :

Étant donné une chaîne , renvoie la somme des nombres apparaissant dans la chaîne, en ignorant tous les autres caractères. Un nombre est une série de 1chiffres ou plus dans une rangée.

(Remarque : Character.isDigit(char)teste si achar est l'un des caractères 0, 1, ..., 9. Integer.parseInt(string)convertit ala chaîne en int.)

sumNumbers("abc123xyz")  →   123
sumNumbers("aa11b33")    →   44
sumNumbers("7 11")       →   18

Ma solution à ce problème est la suivante :

public int sumNumbers(String str) {
  int sum = 0;
  
  java.util.regex.Matcher matcher = java.util.regex.Pattern.compile("[0-9]+").matcher(str);
    while (matcher.find()) {
        sum += Integer.parseInt(matcher.group());
    }
    
  return sum;
}

Est-il possible de résoudre ce problème en utilisant l' API Stream ?

Alexandre Ivanchenko

Est-il possible de résoudre ce problème en utilisant l'API Stream ?

Divisez la chaîne donnée en sous-chaîne qui ne sont pas composées de chiffres à l'aide de .split("\\D+"). Regex "\\D+"correspond à une chaîne composée d'un ou de plusieurs caractères non numériques . Le résultat sera un tableau de chaînes numériques.

Créez un flux sur le tableau et filtrez les chaînes qui ne sont pas vides. Ensuite, analysez la chaîne intavec mapToInt()et appliquez- sum()la en tant qu'opération terminale.

Cette solution passe tous les tests sur CodingBat :

public int sumNumbers(String str) {
    return Arrays.stream(str.split("\\D+"))
        .filter(s -> !s.isEmpty())
        .mapToInt(Integer::parseInt)
        .sum();
}

Puisqu'il ne pouvait y avoir qu'une seule chaîne vide au tout début du tableau produit par .split("\\D+"), afin de réduire le nombre d'actions effectuées dans le stream-pipeline filter()peut être remplacé par dropWhile().

Il ignorera la première chaîne si elle est vide et après la rencontre du premier élément non vide , cette vérification ne sera pas appliquée. C'est-à- dire que le prédicat dropWhile() passé au dropWhile()serait exécuté la plupart du 2temps. En cas de longue chaîne ( sinon toutes les optimisations n'ont pas d'importance ), ce serait moins cher que de générer une nouvelle chaîne avec replaceAll().

public static int sumNumbers(String str) {
    return Arrays.stream(str.split("\\D+"))
        .dropWhile(String::isEmpty)
        .mapToInt(Integer::parseInt)
        .sum();
}

Avertissement : dropWhile() est disponible à partir de Java 9. CodingBat est toujours sur Java 8, il n'est donc pas conscient de cette fonctionnalité. Néanmoins, c'est une solution valable et aussi performante. Vous pouvez le tester dans votre IDE et jouer avec la démo en ligne


Tests (la première solution):

entrez la description de l'image ici

Эта статья взята из Интернета, укажите источник при перепечатке.

Если есть какие-либо нарушения, пожалуйста, свяжитесь с[email protected] Удалить.

Отредактировано в
0

я говорю два предложения

0обзор
Войти в системуУчаствуйте в комментариях

Статьи по теме

Défi Codingbat : solution d'API de flux zeroMax

Défi Codingbat : solution d'API de flux sameEnds

Défi Codingbat : solution d'API zeroFront Stream

Défi Codingbat : maxBlock

Défi Codingbat : mirrorEnds utilisant l'API Stream

Codingbat challenge: mirrorEnds Stream API Solution

kafka new api 0.10 ne fournit pas de liste d'objets de flux et de consommateurs par sujet

Variables d'opérateur personnalisées de flux d'air

Création d'une abstraction de flux de fichiers

Déterminer si la recherche de support de flux PHP

Comment aborder ce défi de codage ?

Julia Flux: déterminer le type de couche

рекурсивное упражнение по codingbat

Рекурсия codingbat

traitement dans le désordre d'un flux d'entrée à l'aide de Reactor

Suppression d'objets de GCS à l'aide d'un flux d'air correspondant à un modèle

Valeur par défaut de sla dans la tâche de flux d'air

Comment obtenir correctement les pointeurs de position de fichier / flux en C ++ pour un flux d'entrée / sortie?

Comment définir la propriété d'un objet à l'aide de flux

Как обрабатывать вложенные ответы API в приложении Flux?

Problème d'analyse de flux dans les champs de mise à jour

comment émettre de la valeur à partir d'un objet de flux construit

Impossible de déterminer le type de retour pour le flux grpc

comment ajouter le résultat de la relation de flux de sortie du processeur executestreamcommand dans le fichier de flux d'origine dans nifi

java.lang.NoClassDefFoundError: Échec de la résolution de: Classe d'application sur Lenovo K4 Note exécutant Android 6, API 23

Syntaxe du flux d'entrée

Plusieurs flux d'authentification dans Apache

Impossible de générer le code d'autorisation via le flux PKCE pour SPA

NPE lors de la désérialisation des messages avro dans les flux kafka

TOP список

  1. 1

    Распределение Рэлея Curve_fit на Python

  2. 2

    TypeError: store.getState não é uma função. (Em 'store.getState ()', 'store.getState' é indefinido, como posso resolver esse problema?

  3. 3

    В типе Observable <unknown> отсутствуют следующие свойства из типа Promise <any>.

  4. 4

    Как добавить Swagger в веб-API с поддержкой OData, работающий на ASP.NET Core 3.1

  5. 5

    How to click an array of links in puppeteer?

  6. 6

    Merging legends in plotly subplot

  7. 7

    ViewPager2 мигает / перезагружается при смахивании

  8. 8

    Отчеты Fabric Debug Craslytic: регистрация, отсутствует идентификатор сборки, применить плагин: io.fabric

  9. 9

    How to normalize different curves drawn with geom = "step" when using stat_summary

  10. 10

    无法通过Vue在传单中加载pixiOverlay

  11. 11

    как я могу удалить vue cli 2?

  12. 12

    Как я могу нарисовать заполненный прямоугольник в JFreeChart?

  13. 13

    SQL Вычтите две строки друг от друга в одном столбце, чтобы получить результат

  14. 14

    Elasticsearch - Нечеткий поиск не дает предложения

  15. 15

    Single legend for Plotly subplot for line plots created from two data frames in R

  16. 16

    Описание моего типа Parser как серии преобразователей монад

  17. 17

    Как изменить цвета запятых и скобок в VS Code

  18. 18

    Сброс значения <input type = "time"> в Firefox

  19. 19

    Почему прокси в vue.config.js 404

  20. 20

    Как установить параметр -noverify с gradle ktx для робоэлектрических тестов Android?

  21. 21

    В чем разница между ifstream, ofstream и fstream?

популярныйтег

файл