#java #android #for-loop
#java #Android #for-цикл
Вопрос:
В настоящее время я создаю мобильное приложение, содержащее игры с угадыванием флагов, используя Android Studio 3.2. Для одной из игр я должен отобразить случайный флаг и соответствующее название (покрытое тире). Пользователь может ввести букву в текстовое поле редактирования внизу и нажать кнопку отправки. Если пользователь получает правильный ответ, то тире с этой буквой удаляются, чтобы показать реальную букву.
Изображение, показывающее пользовательский интерфейс приложения
Проблемы для меня начинаются с замены каждого тире по отдельности. Когда я ввожу букву и отправляю ее, все тире превращаются в ту же букву.
package com.example.anisa.assignment1;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.Random;
public class GuessHints extends AppCompatActivity
{
private ImageView flag;
private int randIndex;
public char[] answers = {};
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_guess_hints);
displayHintsFlag();
splitCountryNameLetters();
}
public void displayHintsFlag()
{
flag = findViewById(R.id.displayHintsFlag);
Random r = new Random();
int min = 0;
int max = 255;
randIndex = r.nextInt(max-min) min;
Country countries = new Country();
int randomHintsFlagImage = countries.countryImages[randIndex];
flag.setImageResource(randomHintsFlagImage);
}
public void splitCountryNameLetters()
{
Country countries = new Country();
String randomHintsFlagName = countries.countryNames[randIndex];
TextView hintsQuestion = (TextView) findViewById(R.id.countryDashesDisplay);
String hintsQuestionString;
int flagNameLength = randomHintsFlagName.length();
char letter;
for (int i = 0; i < flagNameLength; i )
{
Log.d("Flag: ",randomHintsFlagName "");
hintsQuestionString = hintsQuestion.getText().toString();
letter = '-';
hintsQuestion.setText(hintsQuestionString " " letter);
}
Log.d("Answers: ", answers "");
}
public void checkUserEntries(View view)
{
Country countries = new Country();
String randomHintsFlagName = countries.countryNames[randIndex];
int flagNameLength = randomHintsFlagName.length();
TextView hintsQuestion = (TextView) findViewById(R.id.countryDashesDisplay);
String hintsQuestionString = hintsQuestion.getText().toString();
EditText userEntry = (EditText) findViewById(R.id.enterLetters);
String userEntryText = userEntry.getText().toString();
//int numCorr = 0;
char letterChar = userEntryText.charAt(0);
for(int k = 0; k < flagNameLength; k )
{
if((letterChar == randomHintsFlagName.charAt(k)))
{
//numCorr ;
hintsQuestionString = hintsQuestionString.replace(hintsQuestionString.charAt(k), letterChar);
}
}
hintsQuestion.setText(hintsQuestionString);
}
public void nextGuessHints(View view)
{
Button submitButtonHints = (Button) findViewById(R.id.submitLetterButton);
submitButtonHints.setText("Next");
Intent intent = getIntent();
finish();
startActivity(intent);
}
@Override
public void onBackPressed()
{
super.onBackPressed();
startActivity(new Intent(GuessHints.this, MainActivity.class));
finish();
}
}
Я знаю, что проблема связана с использованием индекса k, но не уверен, как решить эту проблему, поскольку она находится в цикле for.
Комментарии:
1. Были ли наши ответы полезными?
2. Да, они были очень полезны, спасибо
Ответ №1:
Допустим, у вас есть начальное значение, String
такое Italia
как.
Пользователь вводит букву i
, и что должно произойти, так это
------ > I---i-
Давайте начнем с преобразования предполагаемой String
версии в пунктирную
final String toBeGuessed = "Italia"; // Italia
final String dashed = toBeGuessed.replaceAll(".", "-"); // ------
Теперь пользователь вводит i
как угаданную букву. Мы преобразуем его в нижний регистр для последующего сравнения.
final char letter = Character.toLowerCase('i');
Что нам нужно сделать, так это обновить пунктирную String
, и для этого мы будем использовать StringBuilder
.
Использование a StringBuilder
позволяет нам устанавливать одиночные символы.
// Create the StringBuilder starting from ------
final StringBuilder sb = new StringBuilder(dashes);
// Loop the String "Italia"
for (int i = 0; i < toBeGuessed.length(); i ) {
final char toBeGuessedChar = toBeGuessed.charAt(i);
// Is the character at the index "i" what we are looking for?
// Remember to transform the character to the same form as the
// guessed letter, maybe lowercase
final char c = Character.toLowerCase(toBeGuessedChar);
if (c == letter) {
// Yes! Update the StringBuilder
sb.setCharAt(i, toBeGuessedChar);
}
}
// Get the final result
final String result = sb.toString();
result
будет I---i-
.
Комментарии:
1. Спасибо за код — это было очень полезно, и в конце концов мне удалось завершить мое приложение!
2. @Anisa привет! Я рад, что вы сделали это в конце;) Если вы хотите, вы можете пометить ответ как принятый!
3. Конечно, подойдет 🙂
Ответ №2:
Как и в Java, строка неизменяема, поэтому вы не можете заменить какую-либо строку другой строкой.
hintsQuestionString = hintsQuestionString.replace(hintsQuestionString.charAt(k), letterChar);
приведенная выше строка не будет работать в Java.
Либо вы можете использовать класс StringBuilder для замены строки
Или
Вам не нужно вводить строку, потому что она не будет работать в Java, поскольку класс String в Java является неизменяемым.
Вы можете просто задать текст в TextView
эту строку вы получили из пользовательской строки hintsQuestionString = hintsQuestion.getText().toString();
затем сравните всю строку, используя метод equals, и если введенная строка будет соответствовать, то вам нужно задать текст. Я взял переменную countryName самостоятельно, вы должны заменить эту строку на вашу выбранную переменную.
if(countryName.equals(hintsQuestionString))
{
hintsQuestion.setText(hintsQuestionString);
}
Я надеюсь, это поможет вам.
Комментарии:
1. Спасибо, однако проблема заключалась в том, что мне пришлось заменять эту строку несколько раз, поэтому это вызвало проблемы