String类使用

String类的使用

String类

String类在java.lang包中,java使用String类创建一个字符串变量,字符串变量属于对象。java把String类声明的final类,不能有类。String类对象创建后不能修改,由0或多个字符组成,包含在一对双引号之间。

String类对象的创建

字符串声明:String stringName;

字符串创建:stringName = new String(字符串常量); 或 stringName = 字符串常量;

String类常用方法

1、求字符串长度 length()

1 String str = new String("asdfzxc");
2 int strlength = str.length();//strlength = 7

2、求字符串某一位置字符 charAt(int index),字符串下标从0开始。

1 String str = new String("asdfzxc");
2 char ch = str.charAt(4);//ch = z

3、提取子串 substring(参数)

参数有常用的两种类型:
1)public String substring(int beginIndex)//该方法从beginIndex位置起,从当前字符串中取出剩余的字符作为一个新的字符串返回。
2)public String substring(int beginIndex, int endIndex)//该方法从beginIndex位置起,从当前字符串中取出到endIndex-1位置的字符作为一个新的字符串返回。

 1 String str1 = new String("asdfzxc");
 2 String str2 = str1.substring(2);//str2 = "dfzxc"
 3 String str3 = str1.substring(2,5);//str3 = "dfz"

4、字符串比较 compareTo(String anotherString):对字符串内容按字典顺序进行大小比较,返回整数,若当前对象比参数大则返回正整数,反之返回负整数,相等返回0;equals(Object anotherObject):比较当前字符串和参数字符串,在两个字符串相等的时候返回true,否则返回false。

String str1 = new String("abc");
String str2 = new String("ABC");
int a = str1.compareTo(str2);//a>0
int b = str1.compareTo(str2);//b=0
boolean c = str1.equals(str2);//c=false
boolean d = str1.equalsIgnoreCase(str2);//d=true,和equals方法类似,忽略大小写

5、字符串分割 split(String regex)

String str1 = new String("a,b,c");
String[] str2 = str1.split(","); //{"a","b","c"}

具体解释:

课程实践

实践内容:模拟实现Linux下Sort -t : -k 2的功能。参考 Sort的实现。提交码云链接和代码运行截图。

Linux的Sort命令是将文件的每一行进行排序,从首字符开始比较ASCII码值,默认按升序输出。

sort(选项)(参数)

选项: -k:排序时,指定本域的开头和结尾;
    -n:依照数值的大小排序;
    -r:以相反的顺序来排序;
    t<分隔字符>:指定排序时所用的栏位分隔字符。
参数: 指定待排序的文件列表。

所以Sort -t : -k 2 指定分隔符为":",以第2列大小为准排列。

import java.util.*;

public class MySort1 {
public static void main(String [] args) {
    String [] toSort = {"aaa:10:1:1",
                        "ccc:30:3:4",
                        "bbb:50:4:5",
                        "ddd:20:5:3",
                        "eee:40:2:20"};

    System.out.println("Before sort:");
    for (String str: toSort)
          System.out.println(str);

    Arrays.sort(toSort);

    System.out.println("After sort:");
    for( String str : toSort)
         System.out.println(str);
  }
}

从上述代码可知,调用了Arrays的sort(array)方法,具体如下:

运行结果如下:

这段代码实现了将文档按照默认的排序方法,即从头到尾进行比较,然后升序排列。

为了实现Sort -t : -k 2 ,还需要将字符串分割和输出整合这两个部分补充上去,根据上述对split方法的学习,可使用split方法完成-t :这个部分的功能,具体如下:

Integer [] tmp = new Integer [toSort.length];
for(int i=0; i<tmp.length; i++)
tmp[i] = Integer.parseInt(toSort[i].split(":")[1]);

一个循环将文档中每一行的第2列数字保存到Integer数组中,这其中使用到了split分割方法,也使用了字符串转为整型的方法,这样就得到了每行的第2列数字。需要注意的是数组的下标从0开始,所以取第2列是数组的下标为1。

下一步就是整合输出,输出时从头至尾进行判定,若该行的第2个数的值和保存第2列数组i中的相同,则将这行输出,循环直至输出完成为止,具体代码为:
for(int i=0; i<tmp.length; i++)
for(int j=0; j<toSort.length; j++)
if(Integer.parseInt(toSort[j].split("😊[1]) == tmp[i].intValue())
System.out.println(toSort[j]);

课后思考

这个课程实践看起来十分简单, 但是仔细想起来还是有一定难度的,比如说如何将字符串处理和数组练习到一起,若没有想到这一点,处理起来还是比较吃力的。当然在学习中还遇到一些问题,总结如下。

1.在老师给出的代码中,在定义整数数组时使用Integer,而不是直接使用int,这二者的区别是什么,老师使用Integer的原因又是什么呢?

通过查找相关资料了解到,int是基本数据类型,Integer是int的包装类,int的初始值为0,而Integer的初始值为null,既然int和Integer是两种不同的概念,那么相同整数值的二者比较是否相同,例如:

int i = 28;
Integer i2 = 28;
Integer i3 = new Integer(28);

System.out.println(i == i2);
System.out.println(i == i3);

最后的运行结果均为true,这是因为Integer会自动拆箱为int,所以值相等,自然结果均为true。还有就是Integer类提供了多个方法,能在 int 类型和 String 类型之间互相转换,还提供了处理 int 类型时非常有用的其他一些常量和方法。总结下来,基于Integer类提供方法能将String类型和int类型转换,Integer会自动拆箱为int类型等原因,在上述处理中,老师选择使用Integer类。

2.在教材中老师提供了两种思路,一种是使用Arrays.sort()方法,另一种是使用Collections.sort()方法,这二者的关联和区别又是什么,换成用Collections.sort()方法该如何实现呢?

Arrays.sort()和Collections.sort()均可用于排序,而要了解二者的区别,首先需要了解Arrays类和Collections类的概念,Arrays是数组类,而Collections则是集合框架的顶层接口,在开发过程中,使用Arrays.sort()来对数组进行排序,而使用Collections.sort()对集合对象进行排序,常见的集合对象包括List、Set、Map等。

若是将上述使用的Arrays.sort()换成使用Collections.sort()来实现,首先需要定义一个集合对象,这里使用ArrayList对象,去存储需要排序那一列的数值,将每行的字符串分割得到该列数值,存储到定义好的集合对象中,具体代码如下:

 ArrayList<String> tmp = new ArrayList<String>();
for(int i=0; i<toSort.length; i++)
 tmp.add(toSort[i].split(":")[1]);

在输出整合部分就比较简单,只需要比较tmp的字符和每行切割出来的第2列的字符是否相同即可,若是相同则输出该行,具体的代码为:

 int i=0;
for(i=0; i<tmp.size(); i++)
for(int j=0; j<toSort.length; j++)
    if(toSort[j].split(":")[1].equals(tmp.get(i)))
        System.out.println(toSort[j]);

最后的运行结果为:

3.老师的方法是将分割好的第2列的值转为Integer类型排序后再整合输出,为什么不能直接判定字符,然后进行整合输出呢?

Arrays.sort()可以直接对String数组进行排序,所以可以省去将String强制转换的过程,直接使用String排序,经过修改代码,即将分割存储代码改为:

String [] tmp = new String [toSort.length];
for(int i=0; i<tmp.length; i++)
tmp[i] = toSort[i].split(":")[1];

整合输出的代码改为:

for(int i=0; i<tmp.length; i++)
 for(int j=0; j<toSort.length; j++)
      if(toSort[j].split(":")[1].equals(tmp[i]) )
           System.out.println(toSort[j]);

运行结果为:

学习反思及总结

通过这次学习让我对于String相关知识,以及排序相关知识有了更深入的了解,虽然这次学习相关的代码不多,但是对于理论知识有了更深入的学习,了解到很多之前忽略的东西,例如Integer和int关联之类的,也进一步提升了我的开发能力。

步骤 耗时 百分比
需求分析 10分钟 10%
设计 10分钟 10%
代码实现 45分钟 30%
测试 45分钟 30%
分析总结 20分钟 20%

posted on 2017-06-10 11:29  吕宇轩  阅读(187)  评论(5编辑  收藏  举报