如何在字符串中的某个位置添加字符(Java)

时间:2014-01-24 21:56:19

标签: java string stringtokenizer

我正在创建一个接受用户输入并生成去演唱会门票的程序。为此,在其中一个文本字段中,用户输入其全名。然后程序获取文本字段的内容并将其设置为字符串Concegoer。为了获得用户的首字母,我使用String Tokenizer将Concegoer分成firstName,middleName和lastName字符串,然后使用substring从每个字符串中获取第一个字母。

我希望程序处理异常,如果用户只输入了文本字段中的一个空格分隔的两个单词(ex名字和姓氏),那么程序会生成一个随机字母,并将其连接到字符串Concegoer在第一个和最后一个名称之间,空格所在的位置,以便middleName可以有一个初始值。我尝试通过处理字符串Concegoer并扫描空格并尝试用字母替换空格来做到这一点。但是,它无法正常工作,程序崩溃了。程序的这一部分的代码如下所示,特别是在for循环中。控制台的println语句主要供参考,崩溃后显示的消息也在下面。

Random numCharacter2 = new Random();

String alphabet2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

char addedLetter2 = alphabet2.charAt(numCharacter2.nextInt(alphabet2.length()));


for (int counter = 0; counter < concertgoer.length(); counter++) {

 char scanner = ' ';

 if (concertgoer.charAt(counter) == scanner) {

     System.out.println(scanner + "\n Hello, World");

     concertgoer = concertgoer.replace(concertgoer.charAt(scanner), addedLetter2); 

     System.out.println("New: " + concertgoer);
 }

} 


 concertgoer = concertgoer + " " + addedLetter2; 

    //! Add letter in middle of string concertgoer if only two words are entered as substitute
      //for middle name

 StringTokenizer token = new StringTokenizer(concertgoer);
 String firstName = token.nextToken();
 String middleName = token.nextToken();
 String lastName = token.nextToken();

 String firstInitial = firstName.substring(0, 1);
 String middleInitial = middleName.substring(0, 1);
 String lastInitial = lastName.substring(0, 1);

 firstInitial = firstInitial.toUpperCase();
 middleInitial = middleInitial.toUpperCase(); 
 lastInitial = lastInitial.toUpperCase();

 System.out.println(firstInitial);
 System.out.println(middleInitial);
 System.out.println(lastInitial);

 String nameInitials = firstInitial + middleInitial + lastInitial;
 nameInitials = nameInitials.replace(" ", "");
 System.out.println(nameInitials);

 //double num = Math.random();
 //Use random class and nextInt set range for any random number

Random num = new Random(); 
int randomInteger = Math.abs(num.nextInt() % 9999);
System.out.println(randomInteger);
ticketPasscode = nameInitials + randomInteger;
String message = "Your ticket passcode is: " + ticketPasscode;
messageBox(message);
System.out.println(ticketPasscode);

有人可以帮我解决这个问题找到正确的方法吗?我感谢您的帮助。谢谢。

*崩溃

Exception in thread "AWT-EventQueue-0" java.util.NoSuchElementException
    at java.util.StringTokenizer.nextToken(StringTokenizer.java:349)
    at TicketPrinter.buttonClicked(TicketPrinter.java:138)
    at BreezyGUI.GBFrameButtonListener.actionPerformed(GBFrame.java:241)
    at java.awt.Button.processActionEvent(Button.java:409)
    at java.awt.Button.processEvent(Button.java:377)
    at java.awt.Component.dispatchEventImpl(Component.java:4861)
    at java.awt.Component.dispatchEvent(Component.java:4687)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:735)
    at java.awt.EventQueue.access$200(EventQueue.java:103)
    at java.awt.EventQueue$3.run(EventQueue.java:694)
    at java.awt.EventQueue$3.run(EventQueue.java:692)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
    at java.awt.EventQueue$4.run(EventQueue.java:708)
    at java.awt.EventQueue$4.run(EventQueue.java:706)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:705)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)

3 个答案:

答案 0 :(得分:1)

在每次调用hasNextToken()之前使用nextToken()来检查是否确实存在下一个令牌。在这一步,你有0,1,2,3 ......弦。

在这一步,如果你有3个字符串(名字,中间名,姓氏),一切都很好,程序继续第一个标记作为第一个名称,第二个标记作为中间名,第三个标记作为姓氏,当然。

如果另一方面,在此步骤中只有两个字符串,则按照所述为中间名称分配一个随机字母,并将第一个标记分配给第一个名称,将第二个标记分配给姓氏。

从那里,你的程序继续

String firstInitial = ...

答案 1 :(得分:1)

你确定这条线吗?

concertgoer = concertgoer.replace(concertgoer.charAt(scanner), addedLetter2); 

这将实际检查String Concegoer中的第32个字符,然后尝试替换它。这是因为char''实际上计算为int 32.你确定这是你想要的功能吗?此外,如果Concegoerer字符串少于32个字符,则会抛出异常。

答案 2 :(得分:0)

这有用吗? (没有测试)

String insert(String input, char tbi, int index) {
    String pre = input.substring(0, index-1);
    String post = input.substring(index, input.length-1);
    return pre + tbi + post;
}

你实际上可以用它做一个单行...