Использование метода замены строки в цикле for для одной строки

#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. Спасибо, однако проблема заключалась в том, что мне пришлось заменять эту строку несколько раз, поэтому это вызвало проблемы