2016-03-27 21 views
1

Dosyaları bir dosyadan alan ve bunları yatay veya dikey olarak basan bir matris programı oluşturdum. Program, bir sözcüğün karakterinin zaten yerinde olup olmadığını ya da düzgün yazdırıldığından emin olmak için spotun boş olup olmadığını kontrol eder. Bir kelime veya karakter başka bir sözcüğün veya karakterin üzerine basılırsa, kelimeyi koymak için yeni bir nokta oluşturulur. Bu sözcük hatasız yazdırılıncaya kadar yapılır. Boş alanlar 'A' harfi ile doldurulur.Bu programdaki bir matris yazdırılan hata nerede?

import java.util.*; 
import java.io.File; 
import java.io.FileNotFoundException; 
import java.util.Scanner; 

public class WordSearch { 

public WordSearch() { 

} 

public void getMatrix() throws FileNotFoundException { 



    File file = new File("/home/cameron/Desktop/words"); 

    ArrayList<String> words = new ArrayList<String>(); 

    String largest = ""; 

    char[][] data; 

    int col = 0; 




    Scanner sc = new Scanner(file); 


    while (sc.hasNextLine()) { 


     String first = sc.nextLine(); 

     words.add(first); 


     if(first.length()>largest.length()){ 



     largest=first; 

     col=largest.length(); 

     } 
    } 



     data = new char[col][col]; 

     int curWord=0; 


     for(int i=0; i<words.size(); i++){ 
      String word=words.get(curWord); 
      int start=0; 
      int row=0; 
      int choice=0; 
      int index=0; 


     do 
     { 

      start = (int)(Math.random()*data.length); 
      row = (int)(Math.random()*data.length); 
      choice = (int)(Math.random()*2); 

     } 
     while(start+word.length()>data.length); 



     index=0; 

     if(choice==0){ 
      for(int j=start; j<start+word.length(); j++){    
       if(data[row][j]==0 || data[row][j]==word.charAt(index)){ 
        data[row][j] = word.charAt(index); 

        index++; 
       } 

       else{ i=0; continue;} 


      } 
     } 

     if(choice==1){ 
      for(int j=start; j<start+word.length(); j++){ 
       if(data[j][row]==0 || data[j][row]==word.charAt(index)){ 
        data[j][row] = word.charAt(index); 

        index++; 
       } 

       else{ i=0; continue;} 
      } 
     } 

      curWord++; 
      } 



     for(int i=0; i<data.length; i++){ 
     for(int j=0; j<data[i].length; j++){ 
      if(data[i][j]==0) 
      System.out.print("A "); 
      else  
      System.out.print(data[i][j]+" "); 
     } 

     System.out.println(); 
     } 


    } 


public static void main(String[] args) throws FileNotFoundException { 



    WordSearch check = new WordSearch(); 

    check.getMatrix(); 

} 
} 

ben kelimenin karakteri sonra for loop (do while yukarıda bir) emin olmak için yeniden edebileceği farklı karakter veya kelime üzerine basılmış olsaydı bir if else deyimi kurmak kelime doğru yazdırılır.

Yine de bir sorun yaşıyorum. Program yaklaşık% 50 iş gibi görünüyor ve böyle bir şey yazdırır:

A A h A A A A f A 
A A a A A l A e A 
A A m A A a A n A 
A A b A A d A c A 
A A u A A y A e A 
A A r A A b A A A 
A A g A A u A A A 
A A e A A g A A A 
A A r A A A A A A 

Bazen bu hatayı ve (bu özel dizinde) yalnızca bu hatayı alıyorum:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 3, Size: 3 
at java.util.ArrayList.rangeCheck(ArrayList.java:653) 
at java.util.ArrayList.get(ArrayList.java:429) 
at WordSearch.getMatrix(WordSearch.java:59) 
at WordSearch.main(WordSearch.java:132) 

sorun ne olabilir ?

Düzenleme: Burada dosyadan programa nelerin okunduğunu geçerli:

ladybug 
hamburger 
fence 
+0

Can Hatayı oluşturan programa girişinizi gösterir misiniz? – pczeus

+0

Eğer (seçim) bloklarınızda ne yapmaya çalışıyorsunuz? – pczeus

+0

@pczeus Bunun için üzgünüz. Alttaki orjinal yazıya koydum. – clopez

cevap

2

Tamam, ben biraz okunabilmesi için bir yöntem haline döngüler için Gözlerinde farklı ortak mantığı ayıklanması kodunuzu temizledik ve yeniden kullanın. Ayrıca, diğer bir koşul size bir soruna neden oluyordu ve 'i' 'yi 0'a geri getirip zaman zaman bir hataya yol açarak gereksizdi.

Lütfen bu değiştirilmiş kodu deneyin ve bir hata almaya devam ederseniz bildirin.

import java.util.*; 
    import java.io.File; 
    import java.io.FileNotFoundException; 
    import java.util.Scanner; 

    public class WordSearch { 
     ArrayList<String> words = new ArrayList<>(); 

     private void getMatrix(String filePath) throws FileNotFoundException { 
      File file = new File(filePath); 
      String largest = ""; 
      char[][] data; 
      int col = 0; 
      Scanner sc = new Scanner(file); 

      while (sc.hasNextLine()) { 
       String first = sc.nextLine(); 
       words.add(first); 

       if(first.length() > largest.length()){ 
        largest = first; 
        col = largest.length(); 
       } 
      } 

      data = new char[col][col]; 
      int curWord = 0; 

      for(int i = 0; i < words.size(); i++){ 
       String word = words.get(curWord); 
       int start = 0; 
       int row = 0; 
       int choice = 0; 

       do{ 
        start = (int)(Math.random()*data.length); 
        row = (int)(Math.random()*data.length); 
        choice = (int)(Math.random()*2); 
       } 
       while(start + word.length() > data.length); 

       updateData(choice, start, row, word, data); 
       curWord++; 
      } 

      for (char[] aData : data) { 
       for (char anAData : aData) 
        if (anAData == 0) 
         System.out.print("A "); 
        else 
         System.out.print(anAData + " "); 
       System.out.println(); 
      } 
     } 

     private void updateData(int choice, int start, int row, String word, char[][] data){ 

      for(int index = 0, j = start; j < start + word.length(); j++){ 
       switch(choice){ 
        case 0: 
         if(data[row][j] == 0 || data[row][j] == word.charAt(index)){ 
          data[row][j] = word.charAt(index); 
          index++; 
         } 
         break; 
        case 1: 
         if(data[j][row] == 0 || data[j][row] == word.charAt(index)){ 
          data[j][row] = word.charAt(index); 
          index++; 
         } 
         break; 
       } 
      } 
     } 

     private String getRandomLetter(){ 
      Random r = new Random(); 
      char c = (char) (r.nextInt(26) + 'a'); 
      return ("" + c).toUpperCase(); 
     } 

     public static void main(String[] args) throws FileNotFoundException { 
      WordSearch check = new WordSearch(); 
      check.getMatrix("/home/cameron/Desktop/words"); 
     } 
    } 

programdır oldukça düzgün, iyi bir iş: ardışık bunu yaklaşık 20 kez çalıştırdıktan sonra, artık bir sorun bakın. Bunu biraz daha ilginç hale getirmek için, zevkinize göre kullanabileceğiniz veya kullanamayacağınız birkaç şeyi ekledim/değiştirdim.

Not getRandomLetter() yöntemini ekledim. Bu şekilde matrisi doldurmak için her seferinde 'A' yerine rastgele harfler kullanabilir ve gerçek kelime aramalarına daha çok benzeyebilirsiniz. Ben de kelime listesine dosyadan kelime eklemek nerede hattını değiştirerek, orijinal kelime ve her rastgele harfi büyük harfe duyarlıdır:

words.add(first.toUpperCase()); 

Şimdi çıkış gibi görünüyor:

K M D X H A L B H 
C M L G A W N F F 
M V W Z M D T O T 
L A D Y B U G T Y 
Y J U J U R D V C 
C I C O R P P I L 
B B P R G R Q L X 
D B D V E X R V K 
E I J H R G L D B 
+0

Temizlik kodu hakkında konuşma. Aferin! –

+0

Ama yine de. Soruyu doğru anlamış olsaydım, bu nokta, kelimenin başka bir tane geçmeden yazılıp yazılmadığını öğrenmektir. Ancak, updateData'da, bu sözcük zaten saklanıyor! Evet, başka bir kelime varsa durur, ancak bu noktaya kadar olan karakterler kalır. –

+0

Bu güncelleştirme için teşekkür ederiz. Ancak, @MarioDekena, asıl kodla ilgili problemin, başlamadan önce kelimeyi depolaması gerçeği olduğunu düşünmüyorum. Özünde, program çalıştığı takdirde programda basılmış olan bütün kelimeleri orada tutmalıdır. Sadece mevcut kelimenin nerede basılacağını değiştirmeye çalışıyorum, sözcüklerden biriyle işe yaramazsa hepsi değil. – clopez

İlgili konular