字符串,扩展题:单链表,约瑟夫

JAVA(字符串)

心理总结:通过对字符串的复习,对字符串有了新的认识和理解

String也有属性,方法,构造器

Scanner sc=new Scanner(System.in);
        //s1  String类的对象
        String s1="abc";
        //创建对象使用构造器
        String ss="abc";
        String s2=new String("abc");
        String s3=new String("abc");
        System.out.println(s1 == s2);//false
        System.out.println(s2 == s3);//false
        System.out.println(s1 == ss);//true
        String s4=sc.next();//输入abc
        System.out.println(s4 == s1);//false

区别图解:

 

 

字符串特点:

  • 字符串不能用==比较,他比较的时虚地址,内存中的存储位置
  • String一旦声明不可该改变

字符串常用方法:

  • length() 取得字符串的长度,和数组长度区别:数组length是属性,字符串length()是方法
  • 对象名.equals(String 类型参数),返回值boolean类型true,false
  • indexOf()字符寻找位置,返回int,lastIndexOf(),从后往前找
  • String 类的 indexOf()方法在字符串中查找子字符串出现的位置,如过存在返回字符串出现的位置(第一位为0),如果不存在返回 -1
  • 字符串函数 substring()函数来删除字符串中的一个字符
  • replace方法可以替换字符串中的字符
String str="Hello World,Hello Java.";
            System.out.println(str.replace('H','W')); //替换全部
            System.out.println(str.replaceFirst("He","Wa")); //替换第一个遇到的
            System.out.println(str.replaceAll("He", "Ha")); //替换全部
  • Javareverse()可字符串反转 
  • split(string)方法通过指定分隔符将字符串分割为数组。
 String str="www-baidu-com";
            String[] temp;
            String delimeter = "-";  //指定分隔符
            temp = str.split(delimeter);  //分割字符串
            //普通for循环
            for(int i =0; i < temp.length; i++){
                System.out.println(temp[i]);
                System.out.println("");
            }
  • String toUpperCase() 方法将字符串从小写转为大写 
  • concat() 连接两个字符串
  • trim() 去掉起始和结尾的空格
  • valueOf() 转换为字符串
  • charAt() 截取一个字符
  • contains() 方法用于判断字符串中是否包含指定的字符或字符串
  • substring(),截取字符串;substring(1),字符串下标包括1之后的;substring(0,3),字符串0到2,不包括3
  • startswith("a",2)是不是以什么开头,从2开始
  • endswith()是不是以什么结尾
  • equalscase()  忽略大小写

 

包装器类型

  • Byte
  • Short
  • Integer  
  • Long  
  • Double
  • Float
  • Character  
  • Boolean  

自动装箱:基本数据类型转包装器类型Interger i=Integer.valueOf(50);

自动拆箱:包装器类型转基本数据类型int i1=i.intValue();

 

JDK1.5之后:

  • 自动装箱,自动拆箱
  • 增强for循环
  • 枚举

JDK1.7之后

  • switch case

 

案例:

  • 转字符串:
       int i=10;
//        String s=i+"";
        String s=String.valueOf(i);
        System.out.println(s);
//其他类型转字符串

 

  • 字符串转字符数组
String arr2="1234567";
char[]  aa=new char[10];
aa=arr2.toCharArray();
for (char c : aa) {
    System.out.print(c+"  ");
}

 

  • 字节数组
byte b[]=arr2.getBytes();
for (byte b1 : b) {
    System.out.print(b1+"  ");//转Ascii码,字节数组在操作文件
}

 

  • 一个字符串在另一个字符串出现次数
public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        String s = "woaichina,chinabutongyubaima,wulunchinahaishijpan,zhaodaogongzuojiushihaoma";
        String sub = "china";
        int fu = zifu(s, sub);
        System.out.println(sub+"在字符串中出现了"+fu+"次");
    }
    public static int zifu(String s,String sub) {
        int oldlen=s.length();
        String re="";
        if(s.contains(sub)){
            re=s.replace(sub,"");
        }
        int newlen=re.length();
        int c=(oldlen-newlen)/sub.length();
        return  c;

    }
  • 获取身份证信息
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        String n1= scanner.next();
        //倒数第二位,奇数男,偶数女,
        fu(n1);
    }
    public static void fu(String n){
        String y=n.substring(6,10);
        String m=n.substring(10,12);
        String date=n.substring(12,14);
        System.out.println(y+"年"+m+"月"+date+"日");
        int sex=(int)n.charAt(16);
        if(sex%2==0){
            System.out.println("女");
        }else if(sex%2!=0){
            System.out.println("男");
        }
        int y1=Integer.parseInt(y);
        Date dt=new Date();
        int year=dt.getYear();//122
        int Year=year+1900;
        System.out.println("年龄"+(Year-y1));

    }

 

扩展题 1:单链表

查看代码
 package mxduixiang.danlianbiao;

 class Node {
    private Object data;// 数据区
    private Node next; // 节点区
 // 构造方法


     public Object getData() {
         return data;
     }

     public void setData(Object data) {
         this.data = data;
     }

     public Node getNext() {
         return next;
     }

     public void setNext(Node next) {
         this.next = next;
     }
 }

public class Kuo {
    public static void main(String[] args) {
        // 测试
        LinkedList list = new LinkedList();
//         list.addTail(1);
//        list.addTail(2);
//        list.addTail(3);
//        list.addTail(4);
//        list.prtn();
         list.addHead(1);
         list.prtn();
         list.addHead(2);
         list.addHead(3);
         list.addHead(4);
         list.prtn();
         list.addIndex(5,3);
         list.find(2);

         System.out.print("采用头插法的链表是:");
         list.prtn();
        list.delete(3);

        list.prtn();
        list.delete(2);

        list.prtn();
    }
}
查看代码
 package mxduixiang.danlianbiao;

public class LinkedList {
    private Node head;
    private  int length;

    public LinkedList(){
        head=new Node();//()里null null
        length=0;
    }

    //头插法
    public void addHead(Object item){
        Node temp = new Node();
        temp.setData(item);
        temp.setNext(head.getNext());
        head.setNext(temp);
        this.length++;
    }

    //尾插法
    public void addTail(Object item){//问题
        Node temp = new Node();
        temp.setData(item);

        Node  r=head;
        for (int i=0;i<length;i++){
            r=r.getNext();
        }

        temp.setNext(r.getNext());
        r.setNext(temp);
        this.length++;
    }

    //指定位置添加
    public void addIndex(Object item,int index){
        //找到要插入节点的前一个结点
        Node xin = new Node();
        xin.setData(item);
        Node temp = head.getNext();
        for (int i = 1; i < index; i++) {
            if(temp.getData()!=item)
                temp=temp.getNext();
        }
        xin.setNext(temp.getNext());
        temp.setNext(xin);
        this.length++;
    }

    // 查找指定位置的节点
     public void find(int index) {
         Node temp = head.getNext();//自己加的
         for (int i = 1; i < index; i++) {
             temp=temp.getNext();
         }
          System.out.println("链表中第" + index + "节点的值是:" + temp.getData());
    }
     // 删除
         public void delete(int index) {//问题
         if (index < 1 | index > 5) {
             System.out.println("位置非法!");
             }
         Node temp = head;//Node temp = head;
             Node temp1 = head;
         // 找到要删除节点的前一个节点
             int c=0;
             while(temp!=null&&c<index-1){
                 temp=temp.getNext();
                 temp1=temp.getNext();
                 c++;
             }
//             temp1=temp.getNext();//申请新节点导致断链
             temp.setNext(temp1.getNext());
             this.length--;
         }
 // 打印链表
         public void prtn() {
         Node temp = head.getNext(); // 指向第一个元素节点
         while (null != temp) {
             System.out.print(temp.getData() + " ");
             temp = temp.getNext();
             }
         System.out.println("长度为" + this.length);
         }

}

 

 

问题二:约瑟夫问题

查看代码
 package mxduixiang.kuozhan;

class Node {
    private Object data;// 数据区
    private Node next; // 节点区
 // 构造方法


     public Object getData() {
         return data;
     }

     public void setData(Object data) {
         this.data = data;
     }

     public Node getNext() {
         return next;
     }

     public void setNext(Node next) {
         this.next = next;
     }
 }

public class Kuo {
    public static void main(String[] args) {
        // 测试
        LinkedList list = new LinkedList();

            list.addTail();
        System.out.println();
            Node t=new Node();
            list.x();
        System.out.println();
//            list.prtn();

    }
}
查看代码
 package mxduixiang.kuozhan;

public class LinkedList {
    private Node head;
    private  int length;

    public LinkedList(){
        head=new Node();//()里null null
        length=0;
    }


//    public void addHead(Object item){
//        Node temp = new Node();
//        temp.setData(item);
//        temp.setNext(head.getNext());
//        head.setNext(temp);
//        this.length++;
//    }

    //尾插法
//    public void addTail(Object item){//问题
//        Node temp = new Node();
//        temp.setData(item);
//
//        Node r=head;
//        for (int i=0;i<length;i++){
//            r=r.getNext();
//        }
//
//        temp.setNext(r.getNext());
//        r.setNext(temp);
//
//        this.length++;
//    }
    public void addTail(){//问题
        head.setData(1);
        length=1;
        Node r=head;
        for (int i=2;i<=41;i++){
            Node t=new Node();
            t.setData(i);
            t.setNext(r.getNext());
            r.setNext(t);
            r=t;
            length++;
        }
        r.setNext(head);
//        System.out.println(length+"   "+r.getData());//31
    }
    public  void  x(){
        Node n=head;
        Node n1=null;
        while(length>1){
            for (int i = 1; i < 2; i++) {
                n=n.getNext();//2
            }
            n1=n.getNext();
            n.setNext(n1.getNext());
            length--;
            n=n.getNext();
        }
        System.out.println(n.getData());
    }


// // 打印链表
//         public void prtn() {
//         Node temp = head.getNext(); // 指向第一个元素节点
//         int i=1;
//         while (i<=length) {
//             System.out.print(temp.getData() + " ");
//             temp = temp.getNext();
//             i++;
//             }
//         System.out.println("长度为" + this.length);
//
//         }

}

 

posted @ 2022-07-20 10:26  一只神秘的猫  阅读(52)  评论(0)    收藏  举报