2015-02-23 2 views
0

Я действительно боролся с назначением программирования. В принципе, мы должны написать программу, которая переводит предложение на английском языке на одно в Pig Latin. Первый метод, который нам нужен, - это токенизация строки, и нам не разрешено использовать метод Split, обычно используемый в Java. Я пытался сделать это в течение последних 2-х дней не повезло, вот что я до сих пор:Метод Tokenize: Разделить строку на массив

public class PigLatin 
    { 
     public static void main(String[] args) 
     { 
       String s = "Hello there my name is John"; 
       Tokenize(s); 
     } 


     public static String[] Tokenize(String english) 
     { 
      String[] tokenized = new String[english.length()]; 
      for (int i = 0; i < english.length(); i++) 
      { 
        int j= 0; 
        while (english.charAt(i) != ' ') 
        { 
         String m = ""; 
         m = m + english.charAt(i); 
         if (english.charAt(i) == ' ') 
         { 
           j++; 
         } 
         else 
         { 
           break; 
         } 
        } 
      for (int l = 0; l < tokenized.length; l++) { 
      System.out.print(tokenized[l] + ", "); 
     } 
     } 
    return tokenized; 
    } 
} 

Все это делает печать чрезвычайно длинный массив «нулевых» с. Если кто-то может предложить какой-либо ввод вообще, я бы reallllyyyy оценить это!

Спасибо заранее Update: Мы должны предположить, что не будет никаких знаков или лишние пробелы, поэтому в основном всякий раз, когда есть место, это новое слово

+0

Если вам разрешено использовать StringTokenizer, это будет делать то же самое, что и split, но вы можете прокручивать маркеры, которые он создает. –

+1

Есть ли вероятность, что вы неверно истолковали задание? Похоже, вы должны создать объект 'StringTokenizer'. – Dando18

+1

m выглядит так, как будто он объявлен на неправильном уровне, он должен находиться вне цикла while. также вы ничего не делаете с ним, когда он заселен. –

ответ

1

Если я правильно понял ваш вопрос, и что ваш Tokenize был предназначен; то я хотел бы начать с написания функции, чтобы разделить String

static String[] splitOnWhiteSpace(String str) { 
    List<String> al = new ArrayList<>(); 
    StringBuilder sb = new StringBuilder(); 
    for (char ch : str.toCharArray()) { 
     if (Character.isWhitespace(ch)) { 
      if (sb.length() > 0) { 
       al.add(sb.toString()); 
       sb.setLength(0); 
      } 
     } else { 
      sb.append(ch); 
     } 
    } 
    if (sb.length() > 0) { 
     al.add(sb.toString()); 
    } 
    String[] ret = new String[al.size()]; 
    return al.toArray(ret); 
} 

, а затем распечатать, используя Arrays.toString(Object[]) как

public static void main(String[] args) { 
    String s = "Hello there my name is John"; 
    String[] words = splitOnWhiteSpace(s); 
    System.out.println(Arrays.toString(words)); 
} 
0

Если вам разрешено использовать StringTokenizer объект (который я считаю, что назначение спрашивает, это будет выглядеть примерно так:

StringTokenizer st = new StringTokenizer("this is a test"); 
while (st.hasMoreTokens()) { 
    System.out.println(st.nextToken()); 
} 

, который будет производить вывод:

this 
is 
a 
test 

Взятый с here.

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

0

Некоторые подсказки для вас, чтобы выполнить «ручное расщепление».

  1. Существует метод String#indexOf(int ch, int fromIndex), чтобы помочь вам найти следующее вхождение символа
  2. Там есть способ String#substring(int beginIndex, int endIndex) извлечь определенную часть строки.

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

List<String> results = ...; 
int startIndex = 0; 
int endIndex = 0; 

while (startIndex < inputString.length) { 
    endIndex = get next index of space after startIndex 
    if no space found { 
     endIndex = inputString.length 
    } 
    String result = get substring of inputString from startIndex to endIndex-1 
    results.add(result) 
    startIndex = endIndex + 1 // move startIndex to next position after space 
} 

// here, results contains all splitted words 
0
   String english = "hello my fellow friend" 
      ArrayList tokenized = new ArrayList<String>(); 
      String m = ""; 
      int j = 0; //index for tokenised array list. 
      for (int i = 0; i < english.length(); i++) 
      { 

        //the condition's position do matter here, if you 
        //change them, english.charAt(i) will give index  
        //out of bounds exception 
        while(i < english.length() && english.charAt(i) != ' ') 
        { 
         m = m + english.charAt(i); 
         i++; 

        } 
        //add to array list if there is some string 
        //if its only ' ', array will be empty so we are OK. 
        if(m.length() > 0) 
        { 
         tokenized.add(m); 
         j++; 
         m = ""; 

        } 

      }  
      //print the array list 
      for (int l = 0; l < tokenized.size(); l++) { 
      System.out.print(tokenized.get(l) + ", "); 

         } 

Печатает " Привет, мой, друг, друг, « Я использовал список массивов, поскольку на первый взгляд длина массива не ясна.