簡體   English   中英

將 c++ 代碼翻譯成 java 代碼時,我得到 java.lang.StringIndexOutOfBoundsException

[英]I get java.lang.StringIndexOutOfBoundsException when translating c++ code into java code

我正在努力解決這個問題

https://vjudge.net/problem/UVALive-6805

我找到了解決方案,但在 c++ 中,誰能幫我將其轉換為 java 代碼。 我是編程的新手

我嘗試了很多解決方案,但沒有一個有效。

如果可能的話,我需要這方面的幫助

例如,我不知道 java 中 c++ 中.erase函數的等價物是什么? c++ 中的 sbstr 是否提供與 java 不同的結果?

#include <iostream>
#include <string>

    using namespace std;

    int syllable(string word)
    {
        int L = word.size();
        int syllable;

        if (L>=7)
        {
            syllable = 3;
        }
        else if (L==6)
        {
            int indicator = 0;

            for (int k=0; k<=L-2; k++)
            {
                string subword = word.substr(k, 2);
                if (subword == "ng" || subword == "ny")
                {
                    indicator++;
                }
            }

            if (indicator == 0)
            {
                syllable = 3;
            }
            else
            {
                syllable = 2;
            }
        }
        else if (L == 4 || L == 5)
        {
            syllable = 2;
        }
        else if (L == 3)
        {
            char Char = word[0];

            if (Char=='a' || Char=='A' || Char=='e' || Char=='E' || Char=='i' || Char=='I' || Char=='o' || Char=='O' || Char=='u' || Char=='U')
            {
                syllable = 2;
            }
            else
            {
                syllable = 1;
            }
        }
        else
        {
            syllable = 1;
        }

        return syllable;
    }

    int main()
    {
        string word;

        int T;

        cin >> T;

        for (int i=1; i<=T; i++)
        {

            int syl[] = {0, -1, -2, -3};
            string rhy[] = {"a", "b", "c", "d"};

            int verse = 0;

            int stop = 0;

            while (stop == 0)
            {
                cin >> word;

                int L = word.size();

                char end = word[L-1];

                if (end == '.')
                {
                    stop = 1;
                }

                if (word[L-1] == ',' || word[L-1] == '.')
                {
                    word = word.erase(L-1, 1);
                    L = word.size();
                }

                if (verse<=3)
                {
                    syl[verse] = syl[verse] + syllable(word);
                }

                if (end == ',' || end == '.')
                {
                    if (verse<=3)
                    {
                        rhy[verse] = word.substr(L-2, 2);
                    }

                    verse++;

                    if (verse<=3)
                    {
                        syl[verse] = 0;
                    }
                }
            }

            int A = 0, B = 0, C = 0, D = 0;

            for (int k=0; k<4; k++)
            {
                if (syl[k] >= 8 && syl[k] <= 12)
                {
                    A = A + 10;
                }
            }

            for (int k=0; k<2; k++)
            {
                if (rhy[k] == rhy[k+2])
                {
                    B = B + 20;
                }
            }

            for (int k=0; k<2; k++)
            {
                if (syl[k] == syl[k+2])
                {
                    C = C + 10;
                }
            }

            if (verse > 4)
            {
                D = (verse - 4) * 10;
            }

            int E = A + B + C - D;

            cout << "Case #" << i << ": " << A << " " << B << " " << C << " " << D << " " << E << endl;         
        }
    }

這是我的嘗試

import java.util.*;

public class First {

    public static int syllable(String word) {
        int L = word.length();
        int syllable;

        if (L >= 7) {
            syllable = 3;
        } else if (L == 6) {
            int indicator = 0;

            for (int k = 0; k < L - 3; k++) {
                String subword = word.substring(k, 2);
                if (subword == "ng" || subword == "ny") {
                    indicator++;
                }
            }

            if (indicator == 0) {
                syllable = 3;
            } else {
                syllable = 2;
            }
        } else if (L == 4 || L == 5) {
            syllable = 2;
        } else if (L == 3) {
            char Char = word.charAt(0);

            if (Char == 'a' || Char == 'A' || Char == 'e' || Char == 'E' || Char == 'i' || Char == 'I' || Char == 'o'
                    || Char == 'O' || Char == 'u' || Char == 'U') {
                syllable = 2;
            } else {
                syllable = 1;
            }
        } else {
            syllable = 1;
        }

        return syllable;
    }

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        String word;

        int T;

        T = sc.nextInt();

        for (int i = 1; i <= T; i++) {

            int syl[] = { 0, -1, -2, -3 };
            String rhy[] = { "a", "b", "c", "d" };

            int verse = 0;

            int stop = 0;

            while (stop == 0) {

                word = sc.next();

                int L = word.length();

                char end = word.charAt(L-1);

                if (end == '.') {
                    stop = 1;
                }

                if (word.charAt(L-1) == ',' || word.charAt(L-1) == '.') {

                    word.substring(L-1, 1);
                    L = word.length();
                }

                if (verse <= 3) {
                    syl[verse] = syl[verse] + syllable(word);
                }

                if (end == ',' || end == '.') {
                    if (verse <= 3) {

                        rhy[verse] = word.substring(L - 2, 2);
                    }

                    verse++;

                    if (verse <= 3) {
                        syl[verse] = 0;
                    }
                }
            }

            int A = 0, B = 0, C = 0, D = 0;

            for (int k = 0; k < 4; k++) {
                if (syl[k] >= 8 && syl[k] <= 12) {
                    A = A + 10;
                }
            }

            for (int k = 0; k < 2; k++) {
                if (rhy[k] == rhy[k + 2]) {
                    B = B + 20;
                }
            }

            for (int k = 0; k < 2; k++) {
                if (syl[k] == syl[k + 2]) {
                    C = C + 10;
                }
            }

            if (verse > 4) {
                D = (verse - 4) * 10;
            }

            int E = A + B + C - D;

            System.out.println("Case #" + i + ": " + A + " " + B + " " + C + " " + D + " " + E);
        }
    }

}

異常由您第二次和第三次調用 String substring 方法引發。 您的 beginIndex 高於您的 endIndex。 正如你在這里看到的https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#substring(int,%20int) beginIndex 總是必須低於 endIndex。

在回答您的問題之前,一般來說,關於字符串和 Java,有一些要點需要提及。

  • 字符串是不可變的(這也適用於 C++)。 這意味着在 String 上調用的任何方法都不會改變它,並且所有方法都簡單地返回原始 String 的新版本,並在其上完成操作
  • java中的substring方法有兩種形式。

    1. 一個接受beginIndex並返回從beginIndexstr.length() - 1 (其中str代表一個字符串)
    2. 另一個接受beginIndexendIndex ,並返回從beginIndexendIndex - 1 beginIndex永遠不應該大於endIndex否則它會拋出一個IndexOutOfBoundsException
  • C++ 的 substring 方法 ( string::substr() ) 接受開頭的“索引”並接受它后面的字符數以包含在子字符串中。 因此,通過執行substr(L-2, 2)可以獲得字符串的最后兩個字符。

  • Java 永遠不會讓你越界。 這意味着您需要不斷檢查您是否在您正在迭代的任何內容的范圍內。

考慮到所有這些,我會去驗證所有substring()方法調用都返回了正確的字符范圍,並且您正確地將substring()返回的值重新分配給了正確的變量。

為了模仿 C++ 的string::erase() ,根據您要擦除的單詞的哪個部分,您需要獲取之前部分的子字符串和之后部分的子字符串,並將它們加在一起。

前任。 假設我有String line = "I do not like the movies"; 因為它是任何人都不可能不喜歡看電影,我們要切出的字not

我們通過做我上面說的來做到這一點

String before = line.substring(0, 5); // This gives us "I do " since it goes up to but not including the 5th index.
String after = line.substring(5 + 3); // This gives us the rest of the string starting after the word "not" because not is 3 characters long and this skips to the 3rd index after index 5 (or index 8)

line = before + after; // This'll add those two Strings together and give you "I do like the movies"

希望這可以幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM