逐字打乱字符串
Shuffling string word by word
美好的一天。我们有一个任务,要求用户在文本区域输入一些东西,当他点击确定按钮时,弹出框应该有他输入的内容。 (例如:"Hello World Tuna" 变为 "olHel odlWr Tnau")。我设法为洗牌做了一个代码,但它把所有的词都弄乱了,而不是一个字一个字地写。
我们不允许使用 Collections 或其他任何东西,那么有没有不使用它们的方法呢?
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class ChallengeSwapper2 extends JFrame
{
JTextArea txtArea;
JScrollPane scrPane;
JLabel lbl;
JButton btn;
Container con;
public ChallengeSwapper2()
{
super("Challenge Swapper!");
setLayout(new FlowLayout());
con = getContentPane();
lbl = new JLabel("INPUT");
lbl.setFont(new Font("Arial", Font.BOLD, 20));
con.add(lbl);
txtArea = new JTextArea(10,15);
txtArea.setWrapStyleWord(true);
txtArea.setLineWrap(true);
txtArea.setFont(new Font("Verdana", Font.BOLD, 20));
scrPane = new JScrollPane(txtArea);
scrPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
scrPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
con.add(scrPane);
btn = new JButton("OK");
btn.setFont(new Font("Arial", Font.BOLD, 10));
btn.setBounds(10,10, 10, 10);
btn.addActionListener(new btnFnc());
con.add(btn);
}
public class btnFnc implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
if (txtArea.getText().equals(""))
{
JOptionPane.showMessageDialog(null,"Please enter something tanga", "Error Message",JOptionPane.INFORMATION_MESSAGE);
}
else
{
String sentence = txtArea.getText();
String[] words = sentence.split(" ");
char [] letters = sentence.toCharArray();
for( int i=0 ; i<words.length-1 ; i++ )
{
int j = (char)(Math.random() * letters.length);
char temp = letters[i];
letters[i] = letters[j];
letters[j] = temp;
}
String newtxt = new String(letters);
JOptionPane.showMessageDialog(null, newtxt, "Swapper Challenge", JOptionPane.INFORMATION_MESSAGE);
}
}
}
public static void main (String [] args)
{
ChallengeSwapper2 gui = new ChallengeSwapper2();
gui.setResizable(false);
gui.setDefaultCloseOperation(EXIT_ON_CLOSE);
gui.setBounds(300,300,330,370);
gui.show();
}
}
您当前的代码将句子拆分为单词,但随后您还将句子转换为字符数组并操纵整个句子。
将句子拆分成单词后,将每个单词转换成字符数组,并将每个单词中的字母打乱,然后重构句子。
我鼓励您将洗牌转移到一种新方法中,这样您就可以隔离洗牌过程,以便清晰和更容易测试。
试试这个。
String s = "Hello World Tuna";
Random r = new Random();
String result = Stream.of(s.split(" "))
.map(x -> x.chars()
.mapToObj(c -> "" + (char)c)
.reduce("", (a, c) -> {
int i = r.nextInt(a.length() + 1);
return a.substring(0, i) + c + a.substring(i);
}))
.collect(Collectors.joining(" "));
System.out.println(result);
美好的一天。我们有一个任务,要求用户在文本区域输入一些东西,当他点击确定按钮时,弹出框应该有他输入的内容。 (例如:"Hello World Tuna" 变为 "olHel odlWr Tnau")。我设法为洗牌做了一个代码,但它把所有的词都弄乱了,而不是一个字一个字地写。
我们不允许使用 Collections 或其他任何东西,那么有没有不使用它们的方法呢?
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class ChallengeSwapper2 extends JFrame
{
JTextArea txtArea;
JScrollPane scrPane;
JLabel lbl;
JButton btn;
Container con;
public ChallengeSwapper2()
{
super("Challenge Swapper!");
setLayout(new FlowLayout());
con = getContentPane();
lbl = new JLabel("INPUT");
lbl.setFont(new Font("Arial", Font.BOLD, 20));
con.add(lbl);
txtArea = new JTextArea(10,15);
txtArea.setWrapStyleWord(true);
txtArea.setLineWrap(true);
txtArea.setFont(new Font("Verdana", Font.BOLD, 20));
scrPane = new JScrollPane(txtArea);
scrPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
scrPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
con.add(scrPane);
btn = new JButton("OK");
btn.setFont(new Font("Arial", Font.BOLD, 10));
btn.setBounds(10,10, 10, 10);
btn.addActionListener(new btnFnc());
con.add(btn);
}
public class btnFnc implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
if (txtArea.getText().equals(""))
{
JOptionPane.showMessageDialog(null,"Please enter something tanga", "Error Message",JOptionPane.INFORMATION_MESSAGE);
}
else
{
String sentence = txtArea.getText();
String[] words = sentence.split(" ");
char [] letters = sentence.toCharArray();
for( int i=0 ; i<words.length-1 ; i++ )
{
int j = (char)(Math.random() * letters.length);
char temp = letters[i];
letters[i] = letters[j];
letters[j] = temp;
}
String newtxt = new String(letters);
JOptionPane.showMessageDialog(null, newtxt, "Swapper Challenge", JOptionPane.INFORMATION_MESSAGE);
}
}
}
public static void main (String [] args)
{
ChallengeSwapper2 gui = new ChallengeSwapper2();
gui.setResizable(false);
gui.setDefaultCloseOperation(EXIT_ON_CLOSE);
gui.setBounds(300,300,330,370);
gui.show();
}
}
您当前的代码将句子拆分为单词,但随后您还将句子转换为字符数组并操纵整个句子。
将句子拆分成单词后,将每个单词转换成字符数组,并将每个单词中的字母打乱,然后重构句子。
我鼓励您将洗牌转移到一种新方法中,这样您就可以隔离洗牌过程,以便清晰和更容易测试。
试试这个。
String s = "Hello World Tuna";
Random r = new Random();
String result = Stream.of(s.split(" "))
.map(x -> x.chars()
.mapToObj(c -> "" + (char)c)
.reduce("", (a, c) -> {
int i = r.nextInt(a.length() + 1);
return a.substring(0, i) + c + a.substring(i);
}))
.collect(Collectors.joining(" "));
System.out.println(result);