1. ホーム
  2. java

[解決済み] ごちゃごちゃした文字列から数字を抽出する

2022-02-14 22:15:44

質問内容

ごちゃごちゃした文字列を渡される。 "OTNWEHRE"

さて、ここから "ONE" "TWO" "THREE" という単語を抽出して、数値形式で表示しなければならないのです。 1 2 3

そこで私が考えた方法は、まず文字配列にすべての単語 "ZERO,ONE,TWO,THREE,..." を格納し、文字列入力をループして、文字列要素と文字配列の比較を行います( O' of string i/p with characters of array ['Z','E','R'..] ). 文字が一致した場合( 'O' of string input will match at 'O' of ONE ) そして、char-array の文字をインクリメントしていきます。 after O matches loop through 'N' then 'E'then ',' ) を作成し、これらの要素が入力された文字列に存在するかどうかをチェックします。文字が一致したら、次の ',' 数字を表示する

しかし、私のアルゴリズムには問題があります。4と5、6と7といった数字は、同じ文字で始まり、異なる文字が続くのです。

以下は私のコードです。

public static void main(String args[])
{
    int i,j,a;
    String wrd="";
    checknum o = new checknum();
    Scanner sc = new Scanner(System.in);
    String s =sc.nextLine();
    String z= "zero,one,two,three,four,five,six,seven,eight,nine,";
    char[] c = z.toCharArray();
    for(i=0;i<s.length();i++)
    {
       wrd ="";
        for(j=0;j<c.length;j++)
        {
            if(s.charAt(i)==c[j])
            {
                wrd = wrd+c[j];
                while(c[j] != ',')
                {
                    j++;
                    if(s.indexOf(c[j])>=0)
                        wrd = wrd+c[j];
                    else{
                        wrd="";
                        break;
                    }
                }
                if(wrd!=null){
                    a=o.checknumber(wrd);
                    System.out.println(a);
                }
            }
        }
    }
}

PS
もし、私のやり方が完全に間違っていて、この問題に対して他のやり方があれば教えてください。

どのように解決するのですか?

私の理解が正しければ、数字は文字を共有することができます。(例: 1つの T を使用した場合、両方の TWOTHREE が含まれます)。

の数をすべて集める。 文字 から 文字列 の中に ハッシュマップ :

String s = ...;
HashMap<Character, Integer> charCount = new HashMap<>();
for (char c : s.toCharArray()) {
    Integer count = charCount.get(c);
    if (count == null) count = 0;
    map.put(c, ++count);
}

この方法では 文字列 を1回だけ実行します。

そして、それぞれの 番号 を独自の ハッシュマップ 文字/整数のペア は、例えば THREE は、次のように格納されます。 {{T,1},{H,1},{R,1},{E,2}} .

そして、それぞれの 番号マップ をチェックし charCount には、それぞれの 文字 (キー) 現在の 番号 で、もし 回数(値) が大きいか等しい。

または、何らかの ツリー構造 を使用します。 数字文字 というように

               _____
              | O,1 |
              |_____|
              /     \
        _____/       \_____
       | E,1 |       | W,1 |
       |_____|       |_____|
       /     \             \
 _____/       \_____        \_____
| N,1 |       | R,1 |       | T,1 |
|_____|       |_____|       |_____|
   v             |             v  
 "ONE"         __|__         "TWO"
              | Z,1 |
              |_____|
                 v
               "ZERO"

そして、その中を歩き、すべての という数字が含まれています。

// pseudocode
recursiveCheck(node) {
    if (charCount.containsKey(node.character) && charCount.get(node.character) > node.count) {
        if (node.hasChildren()) {
            for (childnode in node) {
                recursiveCheck(childnode);
            }
        }
        else {
            // node is leaf, node.number is contained
        }
    }
}