2

我是 java 新手,我一直在尝试解决一个问题,我觉得这个问题的答案可能比我的代码更简单。问题是打印任意长度的用户输入名称的首字母以及完整的姓氏。但这有在没有任何 String.split() 或数组的情况下完成。我尝试让用户一次输入一个单词,但是有没有一种可能的方法可以一次获取整个名称并根据需要进行操作。我的代码如下:

import java.io.*;
public class Initials {
    public static void main(String[]args)throws IOException{
        BufferedReader br =  new BufferedReader(new InputStreamReader(System.in));
        System.out.println("Enter the number of words your name contains");
        int n=Integer.parseInt(br.readLine());
        String str="";
        for(int x=1;x<=n-1;x++){
            System.out.println("Enter your name's word number:"+" "+x);
            String s=br.readLine();
            String st=s.toUpperCase();
            char ch=st.charAt(0);
            str=str+ch+".";
        }
        System.out.println("Enter your surname");
        String sur=br.readLine();
        str=str+" "+sur.toUpperCase();
        System.out.println(str);
    }
}
4

3 回答 3

5

使用正则表达式(即(?<=\w)\w+(?=\s)):

String name = "John Paul Jones";  // read this from the user
System.out.println(name.replaceAll("(?<=\\w)\\w+(?=\\s)", "."));
JP琼斯

split(),没有数组:)


一点解释:我们本质上想用一个字符替换每个单词后面跟一个空格字符(除了第一个字母)的所有字母.。为了匹配这些词,我们使用(?<=\w)\w+(?=\s)

  • (?<=\w)是积极的回顾;它检查匹配开始时是否存在单词字符,但不将其包含在匹配本身中。我们有这个组件是因为我们不想匹配每个名字的第一个字符,而是匹配除第一个之外的所有字符(除了姓氏,我们稍后会处理)。
  • \w+匹配任何连续的单词字符串;我们使用它来匹配名称的其余部分。
  • (?=\s)是积极的前瞻;它检查我们的匹配是否后跟一个空白字符,但不将其包含在匹配本身中。我们包含这个组件是因为我们不想替换姓氏上的任何内容,姓氏后面不应有空格字符,因此不应与正则表达式匹配。
于 2013-06-26T14:47:34.737 回答
0

换一种方式——

import java.util.Scanner;
  //a class that will print your output
class Initial {
  public void Initials() {
    Scanner sc = new Scanner(System.in);
    System.out.print("Enter Full name:");
    String name = sc.nextLine();
    int l = name.length();
    int pos = 0;
    for (int i = l - 1; i >= 0; i--) {
      char ch = name.charAt(i);
      if (ch == ' ') {
        pos = i; //getting the last space before Surname
        break;
      }
    }
    System.out.print("The initials are: ");
    System.out.print(name.charAt(0) + ".");//prints first name initial 
                                              //   with dot
    for (int x = 1; x < pos; x++) //finds midname initial
    {
      char ch = name.charAt(x);
      if (ch == ' ') {

        System.out.print(name.charAt(x + 1) + ".");
      }
    }
    for (int i = pos; i < l; i++) { //for printing Surname
      System.out.print(name.charAt(i));
    }

  }
}

public class Str {
  public static void main(String[] args) {
    Initial i = new Initial();
    i.Initials();
  }
}

于 2016-06-23T09:17:53.953 回答
-1

//此代码适用于任何否。名字中的单词

class Surnam { 
    public static void main(String name) { 
        name = " " + name;
        int l=name.length(), p=0, m=0, r=0;
        char y;
        String word=" ", words=" ";
        for(int i = 0; i = 0; i--) {
            y=name.charAt(i);
            if(y==' ') { 
                r=name.lastIndexOf(y); //extracting the last space of the string
                word=name.substring(i,l); //extracting the surname
                words=name.replace(word," "); //removing the surname break;
            }
        }
        for (int i = 0; i <= r - 1; i++) {
            char x=words.charAt(i);
            if (x == ' ') {
                System.out.print(words.charAt(i + 1) + "."); //Printing all initials before the surname with a dot
            }
        }
        for (int i = l - 1; i >= 0; i--) {
            char x=name.charAt(i);
            if(x==' ') {
                m=i;
                name=name.substring(m,l); //extracting the surname
                name=name.trim(); //removing all the spaces before the surname
                System.out.print(name);
                break;
            }
        }
    }
}
于 2018-08-01T19:02:46.653 回答