2015-05-16 5 views
0

Я новичок в Java, и я нашел интересную проблему, которую я хотел решить. Я пытаюсь закодировать программу, которая меняет положение каждого слова строки. Например, входная строка = «ЗДЕСЬ AM I», строка вывода будет «Я ЗДЕСЬ». Я попал в это, но это не работает для меня. Может ли кто-нибудь любезно указать на ошибку и как ее исправить, потому что мне действительно интересно узнать, что происходит не так. Благодаря!Java слова reverse

import java.util.Scanner; 
public class Count{ 
static Scanner sc = new Scanner(System.in); 
static String in = ""; static String ar[]; 
void accept(){ 
    System.out.println("Enter the string: "); 
    in = sc.nextLine(); 
} 
void intArray(int words){ 
    ar = new String[words]; 
} 
static int Words(String in){ 
    in = in.trim(); //Rm space 
    int wc = 1; 
    char c; 
    for (int i = 0; i<in.length()-1;i++){ 

     if (in.charAt(i)==' '&&in.charAt(i+1)!=' ') wc++; 
    } 
    return wc; 
} 
void generate(){ 
    char c; String w = ""; int n = 0; 
    for (int i = 0; i<in.length(); i++){ 
     c = in.charAt(i); 
     if (c!=' '){ 
      w += c; 
     } 
     else { 
      ar[n] = w; n++; 
     } 

    } 
} 
void printOut(){ 
    String finale = ""; 
    for (int i = ar.length-1; i>=0;i--){ 
     finale = finale + (ar[i]); 
    } 
    System.out.println("Reversed words: " + finale); 
} 
public static void main(String[] args){ 
    Count a = new Count(); 
    a.accept(); 
    int words = Words(in); 
    a.intArray(words); 
    a.generate(); 
    a.printOut(); 
} 
} 
+0

Какой у вас выход? –

+0

Он дает «nullHEREAMHERE» –

+0

Просто используйте split, а затем измените список;) – HyperZ

ответ

1

От добавления отладочного вывода между вызовами каждого метода легко определить, что вы успешно читаете ввод, подсчитываете слова и инициализируете массив. Это означает, что проблема заключается в generate().

Задача 1 в generate() (почему «ЗДЕСЬ» дублируется на выходе): после добавления w в массив (если слово завершения) не сбрасывать w в "", что означает каждое слово имеет предыдущее слово (ы), приложенные к нему. Это легко увидеть, добавив вывод отладки (или используя отладчик) для печати состояния ar и w каждой итерации цикла.

Проблема 2 в generate() (почему «I» не находится на выходе): в строке нет конечного пространства, поэтому условие, которое добавляет слово к массиву, никогда не выполняется для последнего слова раньше цикл завершается в конце строки. Простое исправление - просто добавить ar[n] = w; после окончания цикла, чтобы закрыть последнее слово.

+0

Спасибо тонну! Это то, что я хотел, теперь он решен :) –

1

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

String[] splitString = str.split(" "); 

for(int i = splitString.length() - 1; i >= 0; i--){ 

    System.out.print(splitString[i]); 
    if(i != 0) System.out.print(' '); 
} 

Упс прочитал свой комментарий. Не обращайте внимания на это, если это не то, что вы хотите.

+0

И как мы это сделаем без split()? Это мой вопрос. Я узнал о Сплите для книги Герберта Шильдта, но я не хочу использовать split –

+0

@MissionCoding - вы не хотите использовать split - вы должны указать его в вопросе, это совершенно правильный (и хороший) ответ ! – alfasin

2

Got it. Вот мой код, который реализует split и reverse от scratch. Функция split реализована посредством итерации по строке и отслеживания начальных и конечных индексов. Как только один из индексов в строке эквивалентен «", программа устанавливает индекс конца в элемент за пространством и добавляет предыдущую подстроку к ArrayList, а затем создает новый начальный индекс для начала.

Реверс очень прост - вы просто переходите от конца строки к первому элементу строки.

Пример:

Входной сигнал: DF гс с.о.
Выход: с.о. гс DF

import java.util.Scanner; 
import java.util.ArrayList; 
import java.util.Collections; 

public class Count{ 
    public static void main(String[] args) 
    { 
     Scanner scan = new Scanner(System.in); 
     System.out.println("Enter string to reverse: "); 
     String unreversed = scan.nextLine(); 

     System.out.println("Reversed String: " + reverse(unreversed)); 
    } 

    public static String reverse(String unreversed) 
    { 
     ArrayList<String> parts = new ArrayList<String>(); 
     String reversed = ""; 
     int start = 0; 
     int end = 0; 

     for (int i = 0; i < unreversed.length(); i++) 
     { 
      if (unreversed.charAt(i) == ' ') 
      { 
       end = i; 
       parts.add(unreversed.substring(start, end)); 
       start = i + 1; 
      } 
     } 

     parts.add(unreversed.substring(start, unreversed.length())); 

     for (int i = parts.size()-1; i >= 0; i--) 
     { 
      reversed += parts.get(i); 
      reversed += " "; 
     } 

     return reversed; 
    } 
} 
+0

Спасибо @Henry включил часть вашего кода здесь –

1

Это имеет функцию, которая делает то же самое, как раскол, но не предопределенный функция разделения

public static void main(String args[]) { 
    Scanner sc = new Scanner(System.in); 
    System.out.println("Enter the string : "); 
    String input = sc.nextLine(); 

    // This splits the string into array of words separated with " " 
    String arr[] = myOwnSplit(input.trim(), ' '); // ["I", "AM", "HERE"] 

    // This ll contain the reverse string 
    String rev = ""; 

    // Reading the array from the back 
    for(int i = (arr.length - 1) ; i >= 0 ; i --) { 
     // putting the words into the reverse string with a space to it's end 
     rev += (arr[i] + " "); 
    } 

    // Getting rid of the last extra space 
    rev.trim(); 

    System.out.println("The reverse of the given string is : " + rev); 
} 

// The is my own version of the split function 
public static String[] myOwnSplit(String str, char regex) { 

    char[] arr = str.toCharArray(); 
    ArrayList<String> spltedArrayList = new ArrayList<String>(); 
    String word = ""; 

    // splitting the string based on the regex and bulding an arraylist 
    for(int i = 0 ; i < arr.length ; i ++) { 
     char c = arr[i]; 

     if(c == regex) { 
      spltedArrayList.add(word); 
      word = ""; 
     } else { 
      word += c; 
     } 

     if(i == (arr.length - 1)) { 
      spltedArrayList.add(word); 
     } 
    } 

    String[] splitedArray = new String[spltedArrayList.size()]; 

    // Converting the arraylist to string array 
    for(int i = 0 ; i < spltedArrayList.size() ; i++) { 
     splitedArray[i] = spltedArrayList.get(i); 
    } 

    return splitedArray; 
} 
2

Есть мое предложение:

String s = " HERE AM I "; 
    s = s.trim(); 
    int j = s.length() - 1; 
    int index = 0; 
    StringBuilder builder = new StringBuilder(); 
    for (int i = j; i >= 0; i--) { 

     Character c = s.charAt(i); 
     if (c.isWhitespace(c)) { 
      index = i; 
      String r = s.substring(index+1, j+1); 
      j = index - 1; 
      builder.append(r); 
      builder.append(" "); 
     } 
    } 
     String r=s.substring(0, index); 
     builder.append(r); 
     System.out.println(builder.toString()); 
Смежные вопросы