2013-10-23 38 views
0

这是在java中完成的。如何使用不同阵列中随机选择的字符填充阵列

所以我试图创建一些带有字符的图案生成器。我现在的代码将创建一个数组,它将从输入的第一个数字开始无限地打印,直到最后一个数字,从第一个数组中取出字符。错误的是,如果我从接近尾声开始,并告诉它复制更多; (比如从12个字符开始,复制另外15个字符,但原始数组只有14个字符)。如何在原始数组结束后继续填充数组,例如从头开始并继续通过数组,直到填满。\

import java.util.*; 
public class patternGenerator { 
    private static Scanner input; 
    public static void main(String[] args) {  
    char[] anArray = {'!','@','#','$','%','^','&','*','+','=','~','<','>','?'}; 
    int symbolsPerLine = 0, printed, dontStop = 1, difSymbols; 
    input = new Scanner(System.in); 
    System.out.println("Enter the amount of symbols to use: "); 
    difSymbols = input.nextInt(); 
    while (difSymbols > anArray.length) { 
     difSymbols = (anArray.length-1); 
    } 
    System.out.println("Dif symbols are: "+ difSymbols); 
    System.out.println("Enter amount of symbols per row: "); 
    symbolsPerLine = input.nextInt(); 
    System.out.println("Amount of symbols per line are: "+ symbolsPerLine); 
    char [] patternArray = new char[symbolsPerLine]; 
    System.arraycopy(anArray, difSymbols, patternArray, 0, symbolsPerLine); 
    System.out.print(patternArray); 
    while(dontStop == 1) { 
      System.out.print("\n"); 
      printed = 0; 
      for (int a = 0; a< patternArray.length; a++) { 
        System.out.print(patternArray[a]); 
       } 
       printed++; 
     } 
    } 
} 
+1

提供您想要实现的示例。 – Prateek

+2

如何使用模数? –

回答

1

你可以尝试添加一个索引在你的源阵列和循环它作为您填写的模式阵列:

import java.util.*; 
public class patternGenerator { 
    private static Scanner input; 
    public static void main(String[] args) {  
    char[] anArray = {'!','@','#','$','%','^','&','*','+','=','~','<','>','?'}; 
    int symbolsPerLine = 0, printed, dontStop = 1, difSymbols; 
    input = new Scanner(System.in); 
    System.out.println("Enter the amount of symbols to use: "); 
    difSymbols = input.nextInt(); 
    while (difSymbols > anArray.length) { 
     difSymbols = (anArray.length-1); 
    } 
    System.out.println("Dif symbols are: "+ difSymbols); 
    System.out.println("Enter amount of symbols per row: "); 


    symbolsPerLine = input.nextInt(); 

    System.out.println("Amount of symbols per line are: "+ symbolsPerLine); 
    char [] patternArray = new char[symbolsPerLine]; 

    int srcIndex =0; 
    for(j=0; j < symbolsPerLine; j++) { 
     patternArray[j] = anArray[srcIndex]; 
     srcIndex++; 
     if(srcIndex> (anArray.length-1)) srcIndex =0; 

    } 

    System.out.print(patternArray); 

}

1

所以我注意到的第一件事是你有一个无限循环。你离开dontStop allways == 1,所以你的代码永远不会退出while循环。第二个System.arraycopy(anArray,difSymbols,patternArray,0,symbolsPerLine);当您使用大于anArray.length的数字时, 会出现超出界限的错误,因此您需要删除此代码。这里是一个建议的解决方案:

 char [] patternArray = new char[symbolsPerLine]; 

     int length = symbolsPerLine; 

     int spot = 0; 



     if(symbolsPerLine<anArray.length){ 
      symbolsPerLine = anArray.length; 
     } 


     while(dontStop==1){ 

      for(int i= (anArray.length - difSymbols);i<anArray.length-1;i++){ 

       if(length==0){ 
        dontStop =0; 
        break; 
       } 


       patternArray [spot]= anArray [i]; 
       spot++; 
       length--; 
      } 

     } 

     for(int j=0;j<patternArray.length;j++){ 
      System.out.print(patternArray[j]); 
     } 

     System.out.println("\npatternArray.length is: "+ patternArray.length); 

该解决方案的输出是: 输出RUN1: Dif的符号是:13 输入每行符号的量:每行符号的数量是: 20 成品环路 @#$%^ & + =〜<> @#$%^ & + patternArray.length是:20

输出RUN2: 输入符号的量使用: Dif的符号是:5 输入每行符号的量:每行符号的数量是:20 成品环路 =〜<> =〜 <> =〜<> =〜<> =〜<> patternArray.length是:20

这就是我假设你正在试图完成的任务。

+0

所以实际上这基本上是我想要它做的,但我实际上想要一个无限循环。我希望它可以无限打印,如下所示: $$ ########################### $$ next line: $$ $ ######################### $$$ 而且, –

1

您可以使用以下。我重新考虑了一下你的代码。

我使用CharBuffer,因为它有一些不错的期货像Buffer.hasRemaining()(尚处于缓冲某些地方)和Buffer.put(...)(复制到缓冲区)面临这样一个问题的时候,可以来得心应手。

在您的问题的标题中,您想随机选择字符,但在您的解决方案中,您只需在其上添加数组。我已经使用SecureRandom.nextIn(...)添加了一些可能的解决方案。

import java.nio.CharBuffer; 
import java.security.SecureRandom; 
import java.util.Scanner; 

public class PatternGenerator { 


    public static void main(String[] args) { 
    char[] anArray = {'!', '@', '#', '$', '%', '^', '&', '*', '+', '=', '~', '<', '>', '?'}; 
    int symbolsPerLine = 0, difSymbols = 0; 

    Scanner input = new Scanner(System.in); 

    System.out.println("Enter the amount of symbols to use: "); 
    difSymbols = input.nextInt(); 
    difSymbols = difSymbols < anArray.length ? difSymbols : anArray.length - 1; 
    System.out.println("Dif symbols are: " + difSymbols); 

    System.out.println("Enter amount of symbols per row: "); 
    symbolsPerLine = input.nextInt(); 
    System.out.println("Amount of symbols per line are: " + symbolsPerLine); 
    CharBuffer cb = CharBuffer.allocate(symbolsPerLine); 

    /* 
    * just a copy of the original array appended. 
    */ 

    int offset = 0; 
    int length = 0; 
    while (cb.hasRemaining()) { 
     length = (cb.remaining() > difSymbols ? difSymbols : cb.remaining()) - offset; 
     cb.put(anArray, offset, length); 
     offset = (offset + length) % difSymbols; 
    } 
    // prepare the buffer to be read 
    cb.flip(); 
    System.out.println("appended: " + cb); 

    /* 
    * use random characters now 
    */ 
    cb.clear(); 
    SecureRandom secureRandom = new SecureRandom(); 
    while (cb.hasRemaining()) 
     cb.put(anArray[secureRandom.nextInt(anArray.length)]); 
    cb.flip(); 

    System.out.println("random: " + cb); 


    input.close(); 
    } 
}