Java算法之串的简单处理

题目如下:

串的处理

在实际的开发工作中,对字符串的处理是最常见的编程任务。

本题目即是要求程序对用户输入的串进行处理。具体规则如下:

1. 把每个单词的首字母变为大写。

2. 把数字与字母之间用下划线字符(_)分开,使得更清晰

3. 把单词中间有多个空格的调整为1个空格。

例如:

用户输入:

you and me what cpp2005program

则程序输出:

You And Me What Cpp_2005_program

用户输入:

this is a 99cat

则程序输出:

This Is A 99_cat

我们假设:用户输入的串中只有小写字母,空格和数字,不含其它的字母或符号。

每个单词间由1个或多个空格分隔。

假设用户输入的串长度不超过200个字符。

方法一:

public class 串的简单处理 {
  public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    String string = scanner.nextLine();
    Vector<Character> vector = new Vector<Character>();
    for (int i = 0; i < string.length(); i++) {
      vector.add(string.charAt(i));
    }
    try {
      int index = 0;
      while (index < vector.size()) {
        //判断第一个是否为小写的英文字符,是的话进行操作
        if (index == 0 && vector.elementAt(index) >= 'a'
            && vector.elementAt(index) <= 'z') {
          //Replaces the element at the specified position in this Vector with the specified element
          vector.set(index,(char) (vector.elementAt(index) - ('a' - 'A')));
        } else if (vector.elementAt(index - 1) == ' '&& vector.elementAt(index) == ' ') {
          //处理有多个空格的可能
          vector.remove(index);
          index--;
        } else if (vector.elementAt(index - 1) == ' '
            && (vector.elementAt(index) >= 'a' && vector
                .elementAt(index) <= 'z')) {
          //判断是空格后边的字符
          vector.set(index,
              (char) (vector.elementAt(index) - ('a' - 'A')));
        } else if ((vector.elementAt(index) >= 'a' && vector
            .elementAt(index) <= 'z')
            && (vector.elementAt(index - 1) >= '0' && vector
                .elementAt(index - 1) <= '9')) {
          vector.add(index, '_');
          index++;
        } else if ((vector.elementAt(index - 1) >= 'a' && vector
            .elementAt(index - 1) <= 'z')
            && (vector.elementAt(index) >= '0' && vector
                .elementAt(index) <= '9')) {
          //判断的是数字
          vector.add(index, '_');
          index++;
        }
        index++;
      }
      for (int i = 0; i < vector.size(); i++) {
        System.out.print(vector.elementAt(i));
      }
      System.out.println();
    } catch (ArrayIndexOutOfBoundsException e) {
    }
  }
}

方法二:主要用到正则表达式对字符串进行截取,然后对每一个字符数组的元素进行正则匹配,含有数字的单独进行处理

public class SimpleString {
  // 打印字符串的函数
  public static void print(String[] s) {
    for (int i = 0; i < s.length - 1; i++) {
      System.out.print(s[i] + " ");
    }
    System.out.println(s[s.length - 1]);
  }
  public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    String s = scan.nextLine();
    String[] ss = s.split("[\\s]+"); // 根据正则表达式,删除一个或多个空格,将字符串保存为字符数组
    for (int i = 0; i < ss.length; i++) {
      // 将每一个字符数组的首字母改为大写
      String up = ("" + ss[i].charAt(0)).toUpperCase(); // 大写
      StringBuffer sb = new StringBuffer(ss[i]);
      ss[i] = sb.replace(0, 1, up).toString();
      // 上边已经把字符串数组的首字母该为大写,然后对更改后的字符数组判断是否有数字
      Matcher m = Pattern.compile("\\d+").matcher(ss[i]);// 0-9出现一次或多次
      while (m.find()) {
        // m.group():Returns the input subsequence matched by the previous match
        String num = new String(m.group());
        String num2 = num;
        num2 = "_" + num + "_"; // 数字前后都添加"_"
        ss[i] = ss[i].replace(num, num2);
        if (ss[i].startsWith("_")) { // 去头"_"
          ss[i] = ss[i].substring(1);
        }
        if (ss[i].endsWith("_")) { // 去尾"_"
          ss[i] = ss[i].substring(0, ss[i].length() - 1);
        }
      }
    }
    print(ss);
  }
}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。如果你想了解更多相关内容请查看下面相关链接

(0)

相关推荐

  • Java语言读取配置文件config.properties的方法讲解

    应用场景 有些时候项目中会用到很多路径,并且很可能多个路径在同一个根目录下,那为了方便配置的修改,达到只修改根目录即可达到一改全改的效果,此时就会想到要是有变量就好了: 另外有时候路径中的文件名是不确定的,要靠业务程序运行时去判断文件名应该如何设置,而又希望此文件下的目录名是确定的,那此时用变量也是比较好的解决方式. 一.配置文件config.properties是放在src根目录下的:例如我的是 /PropertiesTest/src/com/xuliugen/project/type.pro

  • java使用Base64实现文件加密解密

    本文实例为大家分享了Java实现Base64给文件加密.解密的具体代码,供大家参考,具体内容如下 package test.base64; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import sun.misc.BASE64Decoder;

  • 使用Java SDK实现离线签名

    严格来说,tx-signer并不属于SDK,它是bytomd中构建交易.对交易签名两大模块的java实现版.因此,若想用tx-signer对交易进行离线签名,需要由你在本地保管好自己的私钥. 如果你的目的是完全脱离于bytomd全节点,可能需要自己做更多额外的工作.比如,在构建交易时,需要花费若干个utxo(Unspent Transaction Output)作为交易的输入,如果没有全节点则需要自身来维护utxo.当使用tx-signer构建完成一笔交易并签名后,若没有全节点的帮助,也需要自己

  • 详解java封装继承多态

    面向对象编程(Object Oriented Programming)有三大特性:封装.继承.多态.在这里,和大家一起加深对三者的理解. 封装 封装可以拆开理解,装,是把数据和方法放进了类里:封,把装进去的数据和成员方法加上访问权限.对于外界,内部细节是透明的,暴露给外面的是它的访问方法. 继承 继承,是为了重用父类代码.两个类若具有is a的关系就可以用extends.另外,继承也为实现多态做了铺垫. 多态 程序中定义的引用变量(java有两大数据类型,内部数据类型和引用数据类型)所指向的具体

  • Java代码实现随机生成汉字的方法

    一.背景知识 GB 2312-80 是中国国家标准简体中文字符集,全称<信息交换用汉字编码字符集·基本集>,由中国国家标准总局发布,1981年5月1日实施.GB2312 编码通行于中国大陆:新加坡等地也采用此编码.中国大陆几乎所有的中文系统和国际化的软件都支持 GB 2312. GB2312 标准共收录 6763 个汉字,其中一级汉字 3755 个,二级汉字 3008 个:同时收录了包括拉丁字母.希腊字母.日文平假名及片假名字母.俄语西里尔字母在内的 682 个字符.GB2312 的出现,基本

  • Java中泛型总结(推荐)

    Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型. 泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数. 泛型类 范例:泛型类的基本语法 class MyClass<T> { T value1; } 尖括号 <> 中的 T 被称作是类型参数,用于指代任何类型.实际上这个T你可以任意写,但出于规范的目的,Java还是建议我们用单个大写字母来代表类型参数.常见的如: T 代表

  • JavaScript刷新页面的几种方法总结

    1,reload 方法 该方法强迫浏览器刷新当前页面. 语法:location.reload([bForceGet]) 参数: bForceGet, 可选参数, 默认为 false,从客户端缓存里取当前页.true, 则以 GET 方式,从服务端取最新的页面, 相当于客户端点击 F5("刷新") 2,replace 方法 方法通过指定URL替换当前缓存在历史里(客户端)的项目,因此当使用replace方法之后,你不能通过"前进"和"后退"来访问已

  • Java实现不同的类的属性之间相互赋值

    在开发的时候可能会出现将一个类的属性值,复制给另外一个类的属性值,这在读写数据库的时候,可能会经常的遇到 ,特别是对于一个有继承关系的类的时候,我们需要重写很多多余的代码,下面有一种简单的方法实现该功能 1.首先有两个类,两个类之间有相同的属性名和类型,也有不同的属性名很类型: public class ClassTestCopy2 { private int id; private String name; private String password; private String sex

  • 9种Java单例模式详解(推荐)

    单例模式的特点 一个类只允许产生一个实例化对象. 单例类构造方法私有化,不允许外部创建对象. 单例类向外提供静态方法,调用方法返回内部创建的实例化对象.  懒汉式(线程不安全) 其主要表现在单例类在外部需要创建实例化对象时再进行实例化,进而达到Lazy Loading 的效果. 通过静态方法 getSingleton() 和private 权限构造方法为创建一个实例化对象提供唯一的途径. 不足:未考虑到多线程的情况下可能会存在多个访问者同时访问,发生构造出多个对象的问题,所以在多线程下不可用这种

  • java腾讯AI人脸对比对接代码实例

    技术栈: Spring boot 2.x 腾讯 java版本1.8 注意事项: 本文内的"**.**"需要自己替换为自己的路径. 常量内的"**"需要自己定义自己内容. 业务中认证图片,上传至阿里云OSS上 话不多说,直接上代码 1.pom文件: <!-- apache httpclient组件 --> <dependency> <groupId>org.apache.httpcomponents</groupId>

随机推荐