随机字符 java

Random characters java

我必须制作一个文本文件,我应该在其中放置 100 个随机字符,其中每个偶数位置应该是一个小写字母,每个奇数位置应该是一个大写字母。此外,所有字母都应该由一个空白字段 (space) 分隔。我只成功制作了一个100个随机字符列表,但我不知道如何做剩下的。

public class Main {

    public static char getRandomCharacter(char c1, char c2) {
        return (char) (c1 + Math.random() * (c2 - c1 + 1));
    }

    public static char[] createArray() {
        char[] character = new char[100];
        for (int i = 0; i < character.length; i++) {
            character[i] = getRandomCharacter('a', 'z');
        }
        for (int i = 0; i < character.length; i++) {
            System.out.println(character[i]);
        }
        return character;
    }

    public static void main(String[] args) {
        createArray();

    }

}

非常感谢您的帮助。

编辑:这是编辑后的版本。然而,输出并没有太大的不同b j r m r b k i...

public class Main {

    public static char getRandomCharacter(char c1, char c2) {
        return (char) (c1 + Math.random() * (c2 - c1 + 1));
    }

    public static char[] createArray() {
        char[] character = new char[100];
        for (int i = 0; i < character.length; i++) {
            character[i] = getRandomCharacter('a', 'z');
        }
        for (int i = 0; i < character.length; i++) {
            System.out.println(character[i]);
        }
        return character;
    }

    public static void main(String[] args) {
        char[] arr = createArray();
        StringBuilder text = new StringBuilder();
        for (int i = 0; i < arr.length; i++) {
            int pos = i + 1;
            if (pos % 2 != 0) {
                String s = "" + arr[i];
                text.append(s.toUpperCase());
            } else {
                text.append(arr[i] + " ");
            }
        }
        String content = text.toString().trim();

    }

}

在您的情况下,先创建 string 然后将其放入 txt 文件会更容易。

您可以简单地遍历随机数组并检查 odd/even 个位置。 在各自的奇偶位置使用 Character.toUpperCaseCharacter.toLowercase 并附加到字符串。

使用 StringBuilder 这样您就不必每次都创建新的 String 对象。

char[] arr = createArray();
StringBuilder text = new StringBuilder();
//iterate thoruh the arr
for (int i = 0; i < arr.length; i++) {
    int pos = i+1;
    if(pos%2!=0){  // check whether current postion is odd or even                 
        text.append(Character.toUpperCase(arr[i])+" ");// if position is odd then convert it to uppercase
    }else{
        text.append(arr[i]+" ");  // if position is even then convert it toLowercase if needed (if arr contents both upper case and lower case)
    }
}
String content = text.toString().trim(); // trimin to remove any extra space in last or first of the string.

写入文件

String path = "D:/a.txt";
Files.write( Paths.get(path), content.getBytes());

编辑 1: 我不确定为什么这个 Character.toUpperCase 不起作用。您可以尝试下面的转换,缺点是每个偶数位置都会创建一个 String 对象。

String s = ""+ arr[i];
text.append(s.toUpperCase()+" ");

编辑 2:您可以使用正常 String

String text = "";
for (int i = 0; i < arr.length; i++) {
    int pos = i + 1;
    if (pos % 2 != 0) {
        String s = "" + arr[i];
        text =text + s.toUpperCase()+" ";
    } else {
        text= text + (arr[i] + " ");
    }
}
String content = text.toString().trim();
System.out.println(content);

这是使用 ASCII 字符流的替代方法。在 ASCII 中,table、a-zA-Z 相邻。因此,对于 0 to 25 中的任何值 d(char)(d + 'a') 将是小写字母,而 (char)(d + 'A') 将是大写字母。

  • 创建一个 Random 实例。
  • 0 to 100 流式传输 100 个字符的整数。
  • 检查 i 的奇偶校验并将 'a' 或 'A' 添加到值 d
  • 映射到字符串并使用 space 作为分隔符加入。

Random r = new Random();
String str = IntStream.range(0,100).mapToObj(
        i -> {
            int d = r.nextInt(26);
            return String.valueOf((char)(i % 2 == 0 ? d + 'a' : d +  'A'));
        }).collect(Collectors.joining(" "));

System.out.println(str);

打印类似于

的内容
j H o C y X h H k A y F z J b D x A z R t Y w O d A a F q F t R n A i B k Y g F 
y X c O r I h E k K t R n L a S d C s T m S z Y z H a V y N o R t S y I t E l W 
q X l E v S h D r C y N h O o C l D u X

要写入文件,请使用 try with resources 并捕获 IO 错误。

String file = "f:/myOutputFile.txt";
try (FileWriter output = new FileWriter(new File(file))) {
    output.write(str);
} catch (IOException ioe) {
    ioe.printStackTrace();
}

这里是你如何用一个简单的循环来完成它。

  • 初始化StringBuilder为偶数第0位的小写字母。这也允许在 space 前面加上结尾以避免尾随 space。
  • 然后从 1 to 100 迭代得到其他 99 个字符。
  • 首先附加 space,然后像前面的示例一样附加适当的字符。
  • 然后你可以把StringBuilder写成一个字符串,如上所示。
StringBuilder sb =
        new StringBuilder().append((char) (r.nextInt(26) + 'a'));
for (int i = 1; i < 100; i++) {
    int d = r.nextInt(26);
    sb.append(" ")
            .append((char) (i % 2 == 0 ? d + 'a' : d + 'A'));
}

代码点

looks correct. But, unfortunately, the char type is legacy. As a 16-bit value, the char type is physically incapable of representing most characters. So I recommend making a habit of using code point 整数而不是 char

IntSupplier IntStream 个代码点

另外,我偶然注意到了方法IntStream.generate that takes an IntSupplier。我们可以编写自己的接口实现 IntSupplier,它交替返回大写字母的代码点编号和返回小写字母的代码点。

在我们的实现中,我们定义了两个对象的枚举,以表示大写和小写。

我们的实现有一个采用这两个枚举对象之一的构造函数。传递的参数表示要生成的第一个字母的大小写。

package work.basil.example.rando;

import java.util.concurrent.ThreadLocalRandom;
import java.util.function.IntSupplier;

public class SupplierOfCodePointForBasicLatinLetterInAlternatingCase
        implements IntSupplier
{
    public enum LetterCase { UPPERCASE, LOWERCASE }

    private LetterCase currentCase;

    public SupplierOfCodePointForBasicLatinLetterInAlternatingCase ( final LetterCase startingCase )
    {
        this.currentCase = startingCase;
    }

    @Override
    public int getAsInt ( )
    {
        int codePoint =
                switch ( this.currentCase )
                        {
                            case UPPERCASE -> ThreadLocalRandom.current().nextInt( 65 , 91 ); // ( inclusive , exclusive )
                            case LOWERCASE -> ThreadLocalRandom.current().nextInt( 97 , 123 );
                        };
        this.currentCase =
                switch ( this.currentCase )
                        {
                            case UPPERCASE -> LetterCase.LOWERCASE;
                            case LOWERCASE -> LetterCase.UPPERCASE;
                        };
        return codePoint;
    }
}

当我们调用自定义的 IntStream 时,我们传递了要生成的代码点数量的限制。

最后,我们将所有生成代码点收集到一个 StringBuilder 中,我们从中构建最终结果 String 对象。

IntStream streamOfCodePoints = IntStream.generate( new SupplierOfCodePointForBasicLatinLetterInAlternatingCase( SupplierOfCodePointForBasicLatinLetterInAlternatingCase.LetterCase.UPPERCASE ) );
String result =
        streamOfCodePoints
                .limit( 100 )
                .collect( StringBuilder :: new , StringBuilder :: appendCodePoint , StringBuilder :: append )
                .toString();

ZtAxIqWfEhOeHdSgOpMyPuJwLuSwJqHzUwSlLeQnFoFcAaMfOxMiBnVuZxOpCvPuLiZhBmIrGaBqZzIyOoUhAdFmXgArVwWqBoWr

添加SPACE

您的要求指定每个生成的字母由 space 分隔。

在某处为 SPACE 字符的代码点 32 定义一个常量。

private static final int SPACE = 32; // ASCII & Unicode code point for SPACE character is 32 decimal.

然后修改我们的 .collect 行以使用扩展语法。我们使用 lambda 代替方法引用。在那个 lambda 中,我们调用 StringBuilder#appendCodePoint 两次。在第一次调用中,我们附加了生成代码点。在第二次调用中,我们附加 SPACE 字符的代码点。

为了消除最后的SPACE,我们trim。

IntStream streamOfCodePoints = IntStream.generate( new SupplierOfCodePointForBasicLatinLetterInAlternatingCase( SupplierOfCodePointForBasicLatinLetterInAlternatingCase.LetterCase.UPPERCASE ) );
String result =
        streamOfCodePoints
                .limit( 100 )
                .collect(
                        StringBuilder :: new ,
                        ( stringBuilder , codePoint ) -> stringBuilder.appendCodePoint( codePoint ).appendCodePoint( App.SPACE ) ,
                        StringBuilder :: append
                )
                .toString()
                .trim() ;

X t D j J g J m Y c J a E e H m U c H b U a R t J g R n G r V s P e B z D k G f H e Z r W t U l U f C z R j F z G k Z f A y I z N i L g Q y Q w D w D w P s F y E n J n I i R b B u H x U m B g K w C k

如果您想将 SPACE 保留在最后,请挂断对 String#trim 的呼叫。