Android 提取子串

Android 提取子串,android,string,substring,Android,String,Substring,我在提取字符串时遇到一些问题 我正在做一个有4个选项的多项选择(例如,作为按钮),通过引用文件名进行选择。该文件(即问题)为png文件,文件名为-Q01AZ7BZ8CZ9DZ10ANZ8.png。这些png放在资产文件夹下 Set<String> regions = regionsMap.keySet(); // get Set of regions // loop through each region for (String region : re

我在提取字符串时遇到一些问题

我正在做一个有4个选项的多项选择(例如,作为按钮),通过引用文件名进行选择。该文件(即问题)为png文件,文件名为-Q01AZ7BZ8CZ9DZ10ANZ8.png。这些png放在资产文件夹下

     Set<String> regions = regionsMap.keySet(); // get Set of regions

     // loop through each region
     for (String region : regions) 
     {
        if (regionsMap.get(region)) // if region is enabled
        {
           // get a list of all flag image files in this region
           String[] paths = assets.list(region);

           for (String path : paths) 
              fileNameList.add(path.replace(".png", ""));
        } // end if
     } // end for

String fileName = fileNameList.get(randomIndex);

if (!quizCountriesList.contains(fileName)) 
{
   quizCountriesList.add(fileName); // add the file to the list

   String nextImageName = quizCountriesList.remove(0);
   correctAnswer = nextImageName; // update the correct answer

   int AZ = correctAnswer.indexOf("AZ");
   int BZ = correctAnswer.indexOf("BZ");
   int CZ = correctAnswer.indexOf("CZ");
   int DZ = correctAnswer.indexOf("DZ");
   int ANZ = correctAnswer.indexOf("ANZ");          

   String choiceA = null;
   String choiceB = null;
   String choiceC = null;
   String choiceD = null;

   choiceA = correctAnswer.substring( (AZ+2), (BZ) );
   choiceB = correctAnswer.substring( (BZ+2), (CZ) );
   choiceC = correctAnswer.substring( (CZ+2), (DZ) );
   choiceD = correctAnswer.substring( (DZ+2), (ANZ) );  
我尝试将按钮设置为.setText(correctAnswer),它将正确地显示为Number-Q01AZ7BZ8CZ9DZ10ANZ8,因此获取“correctAnswer”字符串的顶部应该可以。问题在于提取字符串,但BZ必须位于AZ后面,因此CZ位于BZ后面,等等:

从logcat上看区域长度是-2?我该怎么办? 我希望它适用于Q01,选项A=7、B=8、C=9、D=10和ANZ=8


提前感谢您的建议

您对字符串值的假设是错误的。如果存在AZ、BZ、CZ、DZ、ANZ,则该代码应无错误运行

按照注释中的建议运行调试器,或者使用android logcat提供一些调试上下文
android.utils.Log.d(“APP”,String.format(“AZ=%d”,AZ))

如何存储数据不是什么大问题。你可以调整它几天。。。您可以创建包含图像名称和四个可能答案的xml文件。。。您可以使用下划线方法,也可以使用当前方法。直到它只被你使用,这并不重要。你应该保持简单。更复杂=>出现错误的机会更多


因此,我建议阅读调试和日志记录,而不是改进存储信息的方式。。。将其存储在文件名中,这是一个聪明的想法,快速高效,是一个理想的黑客…

您没有展示足够的代码来了解问题所在(correctAnswer是如何构建的?),但您已经展示了足够的代码,可以看到您真的应该考虑另一种设计。你所有的答案都在一个字符串中,你想把它们分开吗?如果你再想一想,你会帮自己很大的忙。我会加倍西蒙的回答。当Android应用程序由于复杂性而产生异常和故障时,没有理由担心会进行奇怪的压缩或使用技巧来处理字符串。看在上帝的份上,以调试模式运行应用程序,在代码开头放置一个断点,然后逐步执行。。。这就是你应该解决这样一个问题的方法。将值打印到EditText中,这是不可能的。。。试试看,这是一种更干净、更好的感觉;)谢谢你的评论。事实上,我也在考虑设计,但我还没有想出更好的设计(仍在学习)。我的想法是,对于每个问题(作为一个图像),答案已经包含在文件名中,因此文件名就是这样设计的。事实上,之前我使用了Number-Q01_7_8_9_10_8.png,它看起来更容易阅读,并通过拆分“_”来进行子串,但同样的问题再次出现,我想在这里发布,并征求您的专业意见。您的第一个陈述是错误的。“SOMESTRINGAZ”将失败,因为
int AZ=correctAnswer.indexOf(“AZ”+2,(BZ))我写道,如果字符串中存在AZ、BZ、CZ、DZ、ANZ(按特定顺序),那么它应该不会产生错误。。。这有什么问题?
11-09 21:14:08.495: E/AndroidRuntime(25905): FATAL EXCEPTION: main
11-09 21:14:08.495: E/AndroidRuntime(25905): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.trial.quizgame/com.trial.quizgame.QuizGame}: java.lang.StringIndexOutOfBoundsException: length=15; regionStart=1; regionLength=-2
11-09 21:14:08.495: E/AndroidRuntime(25905):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1967)