2015-10-19 2 views
2

Слова в этом коде должны пересекаться в общей букве и печатать столько раз, сколько слова могут пересекаться друг с другом.Как получить одно из моих слов для печати по вертикали?

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

Он должен выглядеть следующим образом:

b 
lottery 
a 
t 

    b 
    o 
    a 
lottery 

    b 
    o 
    a 
lottery 

Но моя печать такой:

b 
lotto 
    a 
    t 
       b 
lotto 
    a 
    t 
       b 
lotto 
    a 
    t 

Моего код отображается ниже, что не так с моим методом печати, который вызывает это?

public class Assg23 
{ 
    public static void main(String[] args) 
    { 

      String w1 = args[0]; 
      String w2 = args[1]; 

      int numberOfCrosses = 0; 

      int pos1=0; 
      int pos2=0; 


      for(int i=0; i < w1.length(); i++) 
      { 
       for(int j=0; j < w2.length(); j++) 
       { 
        if(w1.charAt(i) == w2.charAt(j)) 
        { 
         numberOfCrosses++; 
         crossesAt(w1, pos1, w2, pos2); 
         printCross(w1, pos1, w2, pos2); 
        } 
       } 
      } 

     if(numberOfCrosses == 0) 
     { 
      System.out.println("Words do not cross"); 
     } 
    } 

    private static boolean crossesAt(String w1, int pos1, String w2, int pos2) 
    { 
     if(w1.charAt(pos1) == w2.charAt(pos2)) 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 

    } 

    private static void printCross(String w1, int pos1, String w2, int pos2) 
    { 
     for(int i=0; i < w1.length(); i++) 
     { 
      for(int j = 0; j < w2.length(); j++) 
      { 
       if((j== pos1) && i<w2.length()) 
       { 
        System.out.println(w2.charAt(i)); 
       } 
       if((i == pos2) && j<w1.length()) 
       { 
        System.out.print(w1.charAt(j)); 
       } 
       else 
       { 
        System.out.print(" "); 
       } 

      } 
     } 



    } 
+0

Вы уже сравнения на равенство и, следовательно, не нуждаются в 'crossesAt' вызов метода. –

+0

, когда я вынимаю крестики. Он все равно печатает то же самое. @akhil_mittal – anderkat97

ответ

3

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

public static void main(String[] args) { 
    String w1 = args[0]; 
    String w2 = args[1]; 

    int numberOfCrosses = 0; 

    for (int i=0; i < w1.length(); i++) { 
     for (int j=0; j < w2.length(); j++) { 
      if (w1.charAt(i) == w2.charAt(j)) { 
       numberOfCrosses++; 
       printCross(w1, i, w2, j); 
      } 
     } 
    } 

    if (numberOfCrosses == 0) { 
     System.out.println("Words do not cross"); 
    } 
} 

А вот правильно ли работает реализация вашего метода printCross():

private static void printCross(String w1, int pos1, String w2, int pos2) { 
    // you can replace this for-loop with the line that follows it 
    // if you don't get compiler errors 
    String spaces = ""; 
    for (int i=0; i < pos1; ++i) spaces += " "; 
    //String spaces = String.format(String.format("%%0%dd", pos1), 0).replace("0", " "); 

    for (int i=0; i < w2.length(); ++i) { 
     if (i == pos2) { 
      System.out.println(w1); 
     } 
     else { 
      System.out.println(spaces + w2.charAt(i)); 
     } 
    } 
} 

Вот пример printCross() используется:

printCross("boat", 1, "lottery", 1); 
printCross("coffee", 4, "beverage", 3); 

Выход:

l 
boat 
t 
t 
e 
r 
y 
    b 
    e 
    v 
coffee 
    r 
    a 
    g 
    e 
+0

Я помещаю это и получаю эту ошибку «Исключение в потоке» main «java.util.DuplicateFormatFlagsException: Flags = '0' \t at java.util.Formatter $ Flags.parse (Formatter.java:4443) \t at java.util.Formatter $ FormatSpecifier.flags (Formatter.java:2640) \t at java.util.Formatter $ FormatSpecifier. (Formatter.java:2709) \t на java.util.Formatter.parse (Formatter.java:2560) \t на java.util.Formatter.format (Formatter.java:2501) \t в java.util.Formatter .format (Formatter.java:2455) \t на java.lang.String.format (String.java:2940) \t на Assg23.printCross (Assg23.java:53) \t на Assg23.main (Assg23.java: 27) ' – anderkat97

+0

Код работает нормально в моем локальном IntelliJ. Я предполагаю, что у вашей конфигурации есть какая-то проблема. –

+0

Есть ли что-то, что я должен скачать? Что вы имеете в виду? – anderkat97

0

Использование solution proposed by Tim (кредита идет к нему) вот полный код:

public static void main(String[] args) { 
     String w1 = "boat"; 
     String w2 = "lottery"; 

     int numberOfCrosses = 0; 

     int pos1=0; 
     int pos2=0; 
     int spaces = 0; 

     for(int i=0; i < w1.length(); i++) 
     { 
      for(int j=0; j < w2.length(); j++) 
      { 
       spaces = 0; 
       if(w1.charAt(i) == w2.charAt(j)) 
       { 
        numberOfCrosses++; 
        printCross(w1, i, w2); 
       } else spaces++; 
      } 
     } 

     if(numberOfCrosses == 0) 
     { 
      System.out.println("Words do not cross"); 
     } 
    } 

    private static void printCross(String w1, int pos, String w2) { 
     String spaces = String.format(String.format("%%0%dd", pos1), 0).replace("0", " "); 
     int lengthToTraverse = (w1.length() > w2.length()) ? (w1.length()) : (w2.length()); 
     for (int i=0; i < lengthToTraverse; ++i) { 
      if (i == pos) { 
       System.out.println(w2); 
      } 
      else { 
       if(i<w1.length()) { 
        System.out.println(spaces + w1.charAt(i)); 
       } 
      } 
     } 
    } 

Я добавил проверку на i и удалил один дополнительный параметр в методе. Выход он:

b lottery a t b o a lottery b o a lottery

+0

лотерея и лодка - это просто примеры, когда пользователь может вводить любые слова – anderkat97

+0

@ anderkat97: Проверьте мое редактирование. –

+0

Я не вижу в этом ничего другого. Вы по-прежнему используете лотерею и лодку для строк. – anderkat97