Метод для сравнения и изменения отдельных символов в строке

#java #string #compare

#java #строка #Сравнить

Вопрос:

Мне нужно создать метод для проверки двух строк, например, bod и bot или crab и rab. Метод должен распечатать то, что пользователь должен сделать, чтобы сделать их равными. Например, в bod и bot будет напечатано «заменить, 2, d в строке». Я использовал этот код, который, похоже, работает.

     if(a.length()==b.length()){
        int i;
        for(i=0; i<=a.length(); i  ){
            if(a.charAt(i)!=b.charAt(i)){
                return "replace,"  i   ","   b.charAt(i);
                }
            }
        }  
  

Но у меня возникают проблемы, если две строки не равны по размеру. Я использую это, но это не работает, потому что одна из строк больше.

     int aS = a.length();
    int bS = b.length();
    if(bS - aS == 1){
        int i;
        for(i=0; i<=b.length(); i  ){
            if(b.charAt(i)!=a.charAt(i)){
                return "remove,"   i;
            }
        }
    }
  

Можете ли вы, ребята, подсказать мне, какой метод я могу использовать, чтобы проверить, какая дополнительная буква или, наоборот, буква, которую я могу добавить, а затем вернуть строку с указанием либо удалить символ, либо добавить дополнительный. Спасибо

Комментарии:

1. отличаются ли строки только на один символ?

2. Да, вся строка будет отличаться на один символ

3. Мне кажется, что метод удаления должен работать, за исключением того, что вы рискуете выйти за пределы более короткой строки, например, car и cart . Таким образом, вы должны сравнивать только с длиной более короткой строки (исключительной), и если они настолько равны, удалите последний символ более длинной строки. Надеюсь, это поможет.

4. Да, но что происходит, когда разница находится в середине или в начале

5. @Bakslat опубликовал ответ: D

Ответ №1:

Может быть, что-то вроде этого?

 public ArrayList<String> createConversionList(String primary, String secondary){
  //Determine which string is shorter.
  String shorter;
  String longer;
  boolean primaryIsShorter = false;
  if (primary.length() >= secondary.length()){
    longer = primary;
    shorter = secondary;
  } else{
    longer = secondary;
    shorter = primary;
    primaryIsShorter = true;
  }

  //Fills an array with all the character positions that differ between the
  //two strings, using the shorter string as the base.
  int[] posOfCharsToChange = new int[shorter.length()];
  for(int i = 0; i < shorter.length(); i  ){
    if(shorter.charAt(i) != longer.charAt(i)){
      posOfCharsToChange[i] = i;
    } else{
      posOfCharsToChange[i] = -1;
    }
  }

  //Adds to an ArrayList all of the "Replace" strings.
  ArrayList<String> conversionList = new ArrayList();
  for(int pos: posOfCharsToChange){
    if(pos != -1){
      String s = "Replace "   secondary.charAt(pos)   " with "   primary.charAt(pos)   ". n";
      conversionList.add(s);
    }
  }

  //Depending on which string was bigger, either adds "Add" or "Remove"
  //strings to the ArrayList. If the strings were the same size, does
  //nothing.
  if(primary.length() != secondary.length()){
    if(primaryIsShorter){
      for(int i = primary.length(); i < secondary.length(); i  ){
        String s = "Remove "   secondary.charAt(i)   ". n";
        conversionList.add(s);
      }
    }
    else{
      for(int i = secondary.length(); i < primary.length(); i  ){
        String s = "Add "   primary.charAt(i)   ". n";
        conversionList.add(s);
      }
    }
  }

  return conversionList;
}
  

Ответ №2:

Мой подход работает следующим образом

1) Мы берем меньшую строку и помещаем все ее содержимое в arraylist

2) Мы берем строку большего размера и помещаем ее содержимое в arraylist только в том случае, если ее нет в arraylist

3) Последний символ в arraylist должен быть удален из большей строки, чтобы сделать их равными

Пример 1: a = rab b = crab

1) arraylist = rab -> содержимое добавленного

2) arraylist = rab c -> добавляется только уникальное содержимое b

Пример 2: a = crab b = rab

1) arraylist = rab

2) arraylist = rabc

аналогично, если позиции находятся в середине или не в начале ,

пример: a = racb b = rab

1) arraylist = rab

2) arraylist = rabc

 public class Replace {

public static void main(String args[]) {
    int p = 0, j = 0;
    String a = "rab";
    String b = "crab";

    if (b.length() < a.length()) {

        ArrayList al = new ArrayList();

        for (j = 0; j < b.length(); j  ) {
            if (!al.contains(b.charAt(j))) {
                al.add(b.charAt(j));
            }

        }

        for (j = 0; j < a.length(); j  ) {
            if (!al.contains(a.charAt(j))) {
                al.add(a.charAt(j));
            }

        }

        System.out.println("Remove "   al.get(al.size() - 1)
                  " from String a");
    } else {

        ArrayList al = new ArrayList();

        for (j = 0; j < a.length(); j  ) {
            if (!al.contains(a.charAt(j))) {
                al.add(a.charAt(j));
            }

        }

        for (j = 0; j < b.length(); j  ) {
            if (!al.contains(b.charAt(j))) {
                al.add(b.charAt(j));
            }

        }

        System.out.println("Remove "   al.get(al.size() - 1)
                  " from String b");

    }

  }

}
  

Примечание — Программа работает только при заданных вами ограничениях, когда строки отличаются только одним символом, и порядок обеих строк не будет отличаться, если мы удалим или добавим этот символ.