Почему я получаю несоответствие типов при попытке изменить строку в Java? - PullRequest
0 голосов
/ 28 августа 2011

Итак, я всегда был начинающим программистом, но недавно решил изучать Java.Я просто возился с небольшим конструктором, который должен был взять строку, а затем записать ее задом наперед (мой способ сделать это никоим образом не должен был быть эффективным, я просто использовал различные доступные мне инструменты, чтобы привыкнуть.) Моя ошибка произошла, когда я пытался добавить символ в массиве в строку.Это код:

public class dids {

    char letters[];

    public dids(String thing)
    {
        letters= new char[thing.length()];  
        for(char x:letters){
            letters[x] = thing.charAt(x);
        }
        for(int i=thing.length();i>0;i--){
            String retval += letters[i];
        }
    }
}

Ошибка говорит, что я не могу добавить символ в строку.Несоответствие типов.

Ответы [ 6 ]

2 голосов
/ 28 августа 2011
public class dids { //classes start with an upper case letter (Dids not dids)

char letters[];

public dids(String thing)
{

letters= new char[thing.length()];  //No null check can throw NPE
for(char x:letters){ //letters is an empty array.  
    letters[x] = thing.charAt(x);  
}
for(int i=thing.length();i>0;i--){//style is to count up
    String retval += letters[i]; //retval is recreated every time

}

}

}   

вы хотите использовать String.toCharArray для заполнения массива следующим образом:

letters = thing.toCharArray();

Приведенный ниже код переворачивает строку.

StringBuilder sb = new StringBuilder(thing);  
sb = sb.reverse();  
String retval = sb.toString();
0 голосов
/ 28 августа 2011

Это немного сбивает с толку, но в обеих for loops.

есть две ошибки.

В первом вы используете x в качестве индекса. x как вы определили с помощью char x - это char, а не int (ну, может быть, вы захотите взглянуть на преобразование примитивов, поскольку это может быть сложно). В первом цикле на каждой итерации x будет обновляться и связываться со следующим символом в letters[].

Во втором цикле на самой первой итерации будет возникать исключение IndexOutOfBoundException. Последний элемент массива равен его длине-1, так как массивы основаны на 0!

0 голосов
/ 28 августа 2011

В Java я бы сделал это примерно так (заметьте, это все еще очень неприятно, на самом деле я бы просто что-то из библиотеки commons , но вы поняли идею

public class Dids {

    private String _thing;  

    private String _reversed = "";

    public Dids(String thing) {             
        _thing = thing;             
    }

    public void reverse() {         
        for(int i=_thing.length()-1 ;i>-1; i--){
            _reversed += _thing.charAt(i);
        }
    }

    public String getReversed() {
        return _reversed;
    }
}

public class ReverseTester {

    public static void main(String[] args) {    
        String test = "abcd";

        Dids dids = new Dids(test);
        dids.reverse();

        System.out.println(dids.getReversed());
    }
}
0 голосов
/ 28 августа 2011

В вашем примере было несколько ошибок. Я исправил код и сделал его лучше работающим. Основной ошибкой было то, что вы объявили переменную retval в цикле for.

public void dids(String thing) {
    System.out.println(thing);
    char letters[];


    letters =  thing.toCharArray();
    String retval = "";
    for (int i = thing.length()-1; i >= 0; i--) {
        retval = retval + letters[i];

    }
    System.out.println(retval);

}
0 голосов
/ 28 августа 2011

вам нужно объявить retval вне цикла for:

public dids(String thing)
{

letters= new char[thing.length()];  
for(int x=0;x<letters.length;x++){//using index instead of char
    letters[x] = thing.charAt(x);
}
String retval=""
for(int i=thing.length()-1;i>=0;i--){//fixing of by one
     retval+= letters[i];

}

}

в противном случае он воссоздается и выбрасывается при каждом запуске цикла

были другие ошибки, которые я исправил

0 голосов
/ 28 августа 2011

Вы не сказали нам, в чем ошибка.

Я замечаю следующее:

  1. for(char x:letters){
    Эта форма forцикл будет перебирать каждый символ в letters.Таким образом, x будет установлен для каждого символа в letters.Тем не менее, вы пытаетесь использовать его в качестве индекса - что нормально, так как char может быть приведен к int.Но, поскольку вы никогда не инициализируете массив символов (letters), вы всегда получите значение 0 для x.Это означает, что вы всегда устанавливаете первый элемент letters, перезаписывая предыдущий.

  2. for(int i=thing.length()....
    Поскольку массивы имеют индекс 0, то length будетвсегда быть на один больше, чем индекс последнего элемента.Таким образом, получая доступ к массиву с длиной массива, вы выходите за пределы на 1. Вы должны инициализировать i до thing.length()-1.

  3. String retval += letters[i];
    Это не компилируется - вы не можете объявить и добавление.retval должен быть объявлен вне цикла for.


Вот исправление в вашем коде, которое делает использование метода toCharArray() доступным для String объектов:

public dids(String thing)
{
    letters= thing.toCharArray();

    String retval = "";
    for(int i=thing.length()-1;i>=0;i--){
         retval += letters[i];
    }

}

Несколько более эффективное решение может быть:

public dids(String thing)
{
    StringBuilder sb = new StringBuilder();
    for(int i = thing.length()-1; i >=0; i-- )
    {
        sb.append(thing.charAt(i));
    }
}

Это лучше, потому что

a.String являются неизменяемыми, что означает, что после создания они не могут быть изменены (если вы не прибегаете к использованию отражения), и каждый раз, когда вы добавляете строку, вы фактически создаете новый объект, который в этой ситуации расточителен.StringBuilder или StringBuffer предназначен для использования в случае, когда вы хотите внести изменения в последовательность символов.

b.Поскольку String может быть доступен символ за символом, вам на самом деле не нужно создавать символьное представление строки для ее обращения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...