Обмен элементов в ArrayList - PullRequest
       15

Обмен элементов в ArrayList

0 голосов
/ 21 января 2012

Я хочу написать метод, который принимает строку и заменяет каждую пару символов в ней, а затем объединяет их в новую строку. Пожалуйста, дайте мне знать, как исправить этот код (или написать новый лучший):

    static String s;

    public static void proc(String w) {     
        ArrayList k = new ArrayList();
        ArrayList m = new ArrayList();
        System.out.println(w.length()); 
        int j = 0;
        //test arraylist to check if string is written into arraylist
        for (int i = 0; i < w.length(); i++){
            k.add(w.charAt(i));         
        }
        String p = k.get(2).toString();
        System.out.println(p);  

//here starts the logic of my app
        for (int n = 0; n < w.length(); n++){
            String v = k.get(n).toString();
            if (n == 0){
                m.add(1, v);
            }
            else if (n == 1){
                m.add(0, v);
            }
            else if ((n % 2) == 0){
                m.add(n+1, v);
            }
            else {
                m.add(n, v);
            }           
        }
    }

    public static void main(String[] args){
        s = "tests";
        proc(s);        
    }

Привет, это не домашнее задание, но я делаю упражнения из книги. В любом случае, используя код, предоставленный Джоном, мне удалось работать самостоятельно - он может быть не таким элегантным, но выполняет работу с использованием динамического определения размера:

public static void proc(String w) {     

        ArrayList k = new ArrayList();
        ArrayList g = new ArrayList();
        String h = "";

        for (int i = 0; i < w.length(); i++){   
            char temp = w.charAt(i);
            k.add(i, temp);
        }
        for (int i = 0; i < w.length(); i++){
            if (i == 0){
                h = k.get(1).toString();
                g.add(h);
            }
            else if (i == 1){
                h = k.get(0).toString();
                g.add(h);
            }
            else if ((i % 2) == 0){

                h = k.get(i+1).toString();

                g.add(h);
            }
            else if ((i % 2) == 1){
                h = k.get(i-1).toString();
                g.add(h);
            }
        }
        System.out.println(g.toString());
    }
    public static void main(String[] args){
        s = "test";
        proc(s);
    }

Ответы [ 2 ]

4 голосов
/ 21 января 2012

Я не пытался понять, как именно работает ваш код, но он выглядит излишне сложным для меня. Учитывая, что вам не нужен динамический размер, вы можете сделать это проще с массивом:

public static String swapPairs(String input) {
    char[] chars = input.toCharArray();
    for (int i = 0; i < chars.length - 1; i += 2) {
        char tmp = chars[i];
        chars[i] = chars[i + 1];
        chars[i + 1] = tmp;
    }
    return new String(chars);
}

Обратите внимание, что хотя это будет работать для "простых" символов (где каждый элемент массива не зависит от остальных), он не пытается учитывать любую форму "составных" символов такие как символы, сформированные из двух кодовых единиц UTF-16 (суррогатные пары) или комбинированные символы, такие как «e + острый акцент». Выполнение подобного контекстно-зависимого обмена потребует гораздо больших усилий.

3 голосов
/ 21 января 2012

Это похоже на домашнюю работу, поэтому я ограничу свой ответ парой подсказок.

  1. Я бы накапливал результат в StringBuilder (далее - sb).
  2. У меня был бы цикл (for i = 0; i < w.length(); i += 2).В этом цикле я бы сделал две вещи:
    • , если i + 1 находится в пределах строки, я бы добавил i + 1 -й символ к sb;
    • appendi -й символ до sb.
  3. В конце звоните sb.toString().
...