随机字符 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.toUpperCase
或 Character.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-z
与 A-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
的呼叫。
我必须制作一个文本文件,我应该在其中放置 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.toUpperCase
或 Character.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-z
与 A-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'));
}
代码点
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
的呼叫。