1
votes

Trouver le plus gros élément d'une chaîne avec des mots?

Comment puis-je, dans ABAP, diviser une chaîne en n parties ET déterminer laquelle est le plus gros élément? Dans ma solution, j'aurais besoin de savoir combien d'éléments il y a, mais je veux le résoudre pour QUELQUE NOMBRE d'éléments.

J'ai essayé le code ci-dessous. Et j'ai cherché sur le Web.

DATA: string TYPE string VALUE 'this is a string'.
DATA: part1 TYPE c LENGTH 20.
DATA: part2 TYPE c LENGTH 20.
DATA: part3 TYPE c LENGTH 20.
DATA: part4 TYPE c LENGTH 20.
DATA: del TYPE c VALUE ' '.
DATA: bigger TYPE c LENGTH 20.


split: string AT del INTO part1 part2 part3 part4.

bigger = part1.

IF bigger > part2.
  bigger = part1.
ELSEIF bigger > part3.
  bigger = part2.
ELSE.
  bigger = part4.
ENDIF.
WRITE: bigger.

Résultat attendu: fonctionne avec n'importe quel nombre d'éléments dans une chaîne et détermine lequel est le plus grand.

Résultat réel: J'ai besoin de savoir combien il y a d'éléments


2 commentaires

Vous utilisez le mot "plus grand" qui peut dérouter les gens (actuellement, ils ont compris "le plus long") mais votre algorithme dit que vous voulez trier par ordre alphabétique (A premier, Z dernier) et afficher le dernier mot dans l'ordre ("ceci" exemple, parce que "t" est après "i", "a" et "s"). Pourriez-vous s'il vous plaît modifier votre question pour clarifier ce que signifie «plus grand»?


Sur quelle base allez-vous le diviser? Au sens du mot? Du point de vue du caractère? Que se passe-t-il s'il n'y a pas d'espaces?


4 Réponses :


2
votes

Voici une façon de le résoudre:

DATA: string TYPE string VALUE 'this is a string'.
TYPES: BEGIN OF ty_words,
         word   TYPE string,
         length TYPE i,
       END OF ty_words.
DATA: ls_words TYPE ty_words.
DATA: gt_words TYPE STANDARD TABLE OF ty_words.

START-OF-SELECTION.
  WHILE string IS NOT INITIAL.
    SPLIT string AT space INTO ls_words-word string.
    ls_words-length = strlen( ls_words-word ).
    APPEND ls_words TO gt_words.
  ENDWHILE.
  SORT gt_words BY length DESCENDING.
  READ TABLE gt_words
       ASSIGNING FIELD-SYMBOL(<ls_longest_word>)
       INDEX 1.
  IF sy-subrc EQ 0.
    WRITE: 'The longest word is:', <ls_longest_word>-word.
  ENDIF.

Veuillez noter que cela ne couvre pas le cas s'il y a plus de mots plus longs avec la même longueur, il n'en affichera qu'un.


1 commentaires

Veuillez noter que READ TABLE gt_words ASSIGNING FIELD-SYMBOL () INDEX 1. ne fonctionnera que dans un système qui prend en charge la syntaxe de déclaration en ligne. Si "JT Random" a un système plus ancien, ils doivent le déclarer au préalable avec FIELD-SYMBOLS TYPE ty_words. puis utiliser READ TABLE gt_words ASSIGNING INDEX 1. < / code> à la place.



2
votes

Vous n'avez pas besoin de connaître le nombre de parties divisées si vous divisez la chaîne en un tableau. Ensuite, vous faites une boucle sur le tableau et vérifiez la longueur de la chaîne pour trouver la plus longue.

Bien que la solution de József Szikszai fonctionne, elle peut être trop complexe pour la fonctionnalité dont vous avez besoin. Cela fonctionnerait aussi bien: (également avec la même limitation que cela ne produira que le premier mot le plus long et aucun autre de la même longueur)

DATA string TYPE string VALUE 'this is a string'.
DATA parts TYPE STANDARD TABLE OF string.
DATA biggest TYPE string.

SPLIT string AT space INTO TABLE parts.
SORT parts DESCENDING.
READ TABLE parts INDEX 1 INTO biggest.

WRITE biggest.

Edit: j'ai supposé 'plus grand' signifiait le plus long, mais si vous vouliez réellement le mot qui serait le dernier d'un alphabet, vous pouvez trier le tableau par ordre décroissant et simplement afficher la première entrée comme ceci:

DATA string TYPE string VALUE 'this is a string'.
DATA parts TYPE STANDARD TABLE OF string.
DATA biggest TYPE string.
FIELD-SYMBOLS <part> TYPE string.

SPLIT string AT space INTO TABLE parts.

LOOP AT parts ASSIGNING <part>.

  IF STRLEN( <part> ) > STRLEN( biggest ).
    biggest = <part>.
  ENDIF.

ENDLOOP.

WRITE biggest.


1 commentaires

Votre code est également plus rapide, SORT est plus lent qu'un LOOP



2
votes

Avec ABAP 740, vous pouvez également le raccourcir en:

SPLIT lv_s AT space INTO TABLE DATA(lt_word).
DATA(lv_longest)    = REDUCE string( INIT longest = `` FOR <word> IN lt_word NEXT longest = COND #( WHEN strlen( <word> ) > strlen( longest ) THEN <word> ELSE longest ) ).
DATA(lv_alphabetic) = REDUCE string( INIT alph = ``    FOR <word> IN lt_word NEXT alph    = COND #( WHEN <word> > alph THEN <word> ELSE alph ) ).


0 commentaires

0
votes

Si "le plus grand" signifie le mot "le plus long", voici la manière Regex de le faire:

FIND ALL OCCURRENCES OF REGEX '\w+' IN string RESULTS DATA(words).
SORT words BY length DESCENDING.
WRITE substring( val = string off = words[ 1 ]-offset len = words[ 1 ]-length ).


0 commentaires