String的补充及完数

  String的常见内存分析题:

    String str1 = new String("hello world");
    String str2 = new String("hello world");
    System.out.println(str1 == str2);
    System.out.println(str1.equals(str2));
    String str3 = "hello world";
    System.out.println(str1 == str3);
    String str4 = "hello world";

    System.out.println(str3 == str4);

内存分析:

indexOf( )函数的用法:

 

 

String的其他常见方法见博客:https://www.cnblogs.com/laurarararararara/p/11448731.html

 

小练习 1•:

       /**
         * 用户输入一段字符串,包含数字,字母以及其它的字符,统计
         * 字符串中,数字,字母以及其它的字符各自出现的次数,并打印
         * 出来
         */

逻辑分析:遍历整个字符串,并且需要获取字符串中的每一个字符,判断这个字符是否是数字,字符或者其他类型。

判断是字串的数字的函数:isDigit( ),  判断是否是字符isLetter( ).

代码实现:

 Scanner in = new Scanner(System.in);
        String str = in.nextLine();
      System.out.println(str);
     int numberCnt=0;
     int number = 0;
     int charCnt=0;
     int others=0;
      for (int i = 0; i <str.length(); i++) {
     char ch=str.charAt(i);//获取字符串的字符的方法   charAt( )
     if(Character.isDigit(ch)){   //查找数字个数的方法
           numberCnt++;
        }
//          else if ((ch<='z'&&ch>='a')||(ch<='Z'&&ch>='A')){  //注意或者关系。大写或者小写
//          CHAR_NUMBER++;
//           }
        else if(Character.isLetter(ch)){
              charCnt++;
           }
           else{
              others++;
          }
       }
        System.out.println("numberCnt:"+numberCnt);
        System.out.println("charCnt:"+charCnt);
        System.out.println("others:"+others);

结果实现:

 

 补充•:快捷键注释多行代码与取消注释   ctrl+/  可以注释多行,也可撤销

             段注释   ctrl+alt+/  可以注释一段,也可撤销

 

ctrl+/   效果如图:

 

ctrl+alt+/  效果如图:

 

 

 

 小练习2•:

     /**

      * 获取用户输入的一段字符串,该字符串格式(每个字串用空格隔开)如下,把用户输入的数组中的单词找出来并打印

     *如abc7 789t thi *uhh jui 890

     *则输出的单词为thi jui

     */

 

逻辑分析:用户输入字符串的特点是每输入一段小串,然后用空格隔开,接着输入下一小串。程序的目的是为了找出每一小串是否全是字符则为单词,

若每一小串的开始第一个就不是字符,则之间跳到写一个空格处继续开始,无需往后判断。

若没遇到空格,则判断该小串是否全是字符;若遇到空格,则需判断,是因为遍历完了单词串后才遇到的空格,还是从之前跳过来的,

如果是遍历完单词串则需要记录单词数目。

根据该逻辑,可以写出简单的if else逻辑

if(){

}

else{

if(){}

}

 

定义一个flag 变量来判断遇到空格后是否遇到了单词。

if(ch!=" "){    //如果没有遇见空格,表示正在遍历

if(!Charachter.isLetter(ch)){  //如果遍历期间遇见了不是单词的,则flag置为false,表示不是一个单词

 

  flag=false;

 }

}else{    //否则,遇见了空格

if(flag){   //前面遍历的是单词

number++;   //记录单词数目

 

}

else{   //否则,需要重新判断

flag=false;}

 

 

 

不足:该程序并未考虑到最后输入的字符串是单词的情况:

改进如下:

 

 因为最后的输入的下一个没有遇见空格,所以遍历了剩下的字符串但是没有进入else中判断,所有没有记入单词数目,改进如下:

 如何打印字符串?subString方法,提取字符串:

String substr = str.substring(idx, str.length());

 

 上述问题:将用户的输入一组字符单词个数统计完之后,并将单词打印出来

思路:在判断是单词的时候,将单词打印出来,用当前正在遍历的位置i减去单词的长度count即可获得子串

 

 整个代码为:

import java.util.Scanner;
public class StringTestUnit{
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        String str = in.nextLine();
        int charCnt = 0;//字符
        boolean flag = true;//默认为是一个单词
        int number = 0;
        int count = 0;
        for (int i = 0; i < str.length(); i++) {
            char ch = str.charAt(i);//找索引
            if (ch != ' ') {
                // 如果判断字符的过程中,遇见一个不是字母的字符,不用继续判断了
                // 直接往后找' '  'a' '8'
                if (flag && !Character.isLetter(ch)) {
                    // 已经不是一个字母了,也就是不是一个单词了
                    flag = false;
                }
                count++;
            } else { // 否则如果遇见空格了
                if (flag) {
                    System.out.println(str.substring(i - count, i));  //当前正在遍历的位置-单词的字符个数
                    number++;
                }
                flag = true; // flag需要重置以下,马上要遍历下一个串了
                count = 0;
            }
        }
        //这里面需要处理一下长串中的最后一个小的字串是不是单词
        if (flag) {
            number++;
            System.out.println(str.substring(str.length() - count, str.length()));
        }
        System.out.println(number);
    }
}    

 

 小练习3•:

 

/**
* 请输出1000以内的完数,完数是他的因子的整数的和刚好等于数字本身,比如6=1+2+3
* 此时,6为完数
*输出结果如下 6:1 2 3
*/

如果因数和等于该整数,则这个数为完数。求因数的方法:该整除 除以从1到比它小的整除,如果能整除,则该数为因子。

题目要求输入因子,需要一个数组来暂时储存因子,否则输出又要重新计算该数的因子。

for(int i=1;i<=1000;i++){  //整数

   for(int j;j<i;j++){//因数

      if(i%j==0)

      sum=sum+j;  //因数和

      arr[i]=j;//将因子依次放入数组

      i++;   //持续记录数组的值

      }

if(sum==i)

 {

  System.out.print(i+":");

  for(int j=0;j<i;j++){

  System.out.print(arr[j]+" ");

   }

  }

}

public class StringTestUnit2 {
    public static void main(String[] args) {
        /**
         * 请输出1000以内的完数,完数是他的因子的整数的和刚好等于数字本身,比如6=1+2+3
         * 此时,6为完数
         */
        String str1="abc";
        int arr[]=new int[500];
        int index=0;
        for(int i=1;i<=1000;i++) {
            //求出i所有的因数
            int sum=0;
            for (int j = 1; j <i; j++) {
                if (i % j == 0) {
                    arr[index]=j;  //将因子记录在数组里
                    index++;
                    sum = sum + j;
                }
            }
            if (sum == i) {
                System.out.print(i+":");
                for(int j=0;j<index;j++)
                {
                    System.out.print(arr[j]+ " ");  //输出数组
                }
                System.out.println();
            }
            index=0;  //将索引置0,开始下一个数字的因子在数组的存储
        }

    }
}

 

 

posted @ 2019-09-15 19:18  acehm  阅读(214)  评论(0编辑  收藏  举报