如何遍历字符串并按照Java中的要求处理它?

如何遍历字符串并按照Java中的要求处理它?,java,string,Java,String,我对Java编程相当陌生,因此在处理这样的问题时会遇到一些问题。我正在编写一个程序来检查字符串输入是否包含至少2个奇数。作为我正在解决的问题的一部分,它要求我输入我的号码的位数,但这与此无关 我试图遍历字符串,将前两个发现的奇数记录在字符串中,然后打印出来。但它似乎失败了,我不明白为什么 注意:如果字符串输入是12272,那么它应该打印17,因为这两个是唯一的奇数 package myPackage; import java.util.Scanner; public class Main {

我对Java编程相当陌生,因此在处理这样的问题时会遇到一些问题。我正在编写一个程序来检查字符串输入是否包含至少2个奇数。作为我正在解决的问题的一部分,它要求我输入我的号码的位数,但这与此无关

我试图遍历字符串,将前两个发现的奇数记录在字符串中,然后打印出来。但它似乎失败了,我不明白为什么

注意:如果字符串输入是12272,那么它应该打印17,因为这两个是唯一的奇数

package myPackage;

import java.util.Scanner;

public class Main {
    public static Scanner scanner = new Scanner(System.in);
    public static void main(String[] args) {
        int tc = scanner.nextInt();

        while(true){
            String str="";
            int n = scanner.nextInt();
            String num = scanner.nextLine();
            int cnt = 0;
            for (int i = 0; i < num.length(); i++) {
                int extractedDigit = Integer.parseInt(Character.toString(num.charAt(i)));
                if(extractedDigit % 2 != 0){
                    cnt++;
                    str += Integer.toString(extractedDigit);
                    if(cnt == 2)break;
                }

            }
            if(cnt == 2) System.out.println(str);
            else System.out.println("-1");

            if(tc == 0)break;
            tc--;
        }
    }
}

“num”变量始终为空字符串。这是因为Scanner.nextInt只读取数字字符,并留下尾随的行分隔符,但它在数字之前读取行分隔符。因此,在调用nextInt之后,扫描仪中的下一个可读字符是行分隔符

Scanner.nextLine,顾名思义,一直读取到下一行分隔符。这恰好是第一个字符,因此它返回一个空字符串,其中不包含奇数

package myPackage;

import java.util.Scanner;

public class Main {
    public static Scanner scanner = new Scanner(System.in);
    public static void main(String[] args) {
        int tc = scanner.nextInt();

        while(true){
            String str="";
            int n = scanner.nextInt();
            String num = scanner.nextLine();
            int cnt = 0;
            for (int i = 0; i < num.length(); i++) {
                int extractedDigit = Integer.parseInt(Character.toString(num.charAt(i)));
                if(extractedDigit % 2 != 0){
                    cnt++;
                    str += Integer.toString(extractedDigit);
                    if(cnt == 2)break;
                }

            }
            if(cnt == 2) System.out.println(str);
            else System.out.println("-1");

            if(tc == 0)break;
            tc--;
        }
    }
}
要解决此问题,如果输入文本位于单独的行上,请使用Integer.parseIntscanner.nextLine而不是nextLine,或者在关键语句之前调用scanner.nextLine来读取空行

编辑:工作代码,假设每个输入位于单独的行上:

    int tc = Integer.parseInt(scanner.nextLine());
    
    while(true){
        String str="";
        int n = Integer.parseInt(scanner.nextLine());
        String num = scanner.nextLine();
        int cnt = 0;
        for (int i = 0; i < num.length(); i++) {
            int extractedDigit = Integer.parseInt(""+num.charAt(i));
            if(extractedDigit % 2 != 0){
                cnt++;
                str += Integer.toString(extractedDigit);
                if(cnt == 2)break;
            }
            
        }
        if(cnt == 2) System.out.println(str);
        else System.out.println("-1");
        if(tc == 0)break;
        tc--;
    }

“num”变量始终为空字符串。这是因为Scanner.nextInt只读取数字字符,并留下尾随的行分隔符,但它在数字之前读取行分隔符。因此,在调用nextInt之后,扫描仪中的下一个可读字符是行分隔符

Scanner.nextLine,顾名思义,一直读取到下一行分隔符。这恰好是第一个字符,因此它返回一个空字符串,其中不包含奇数

package myPackage;

import java.util.Scanner;

public class Main {
    public static Scanner scanner = new Scanner(System.in);
    public static void main(String[] args) {
        int tc = scanner.nextInt();

        while(true){
            String str="";
            int n = scanner.nextInt();
            String num = scanner.nextLine();
            int cnt = 0;
            for (int i = 0; i < num.length(); i++) {
                int extractedDigit = Integer.parseInt(Character.toString(num.charAt(i)));
                if(extractedDigit % 2 != 0){
                    cnt++;
                    str += Integer.toString(extractedDigit);
                    if(cnt == 2)break;
                }

            }
            if(cnt == 2) System.out.println(str);
            else System.out.println("-1");

            if(tc == 0)break;
            tc--;
        }
    }
}
要解决此问题,如果输入文本位于单独的行上,请使用Integer.parseIntscanner.nextLine而不是nextLine,或者在关键语句之前调用scanner.nextLine来读取空行

编辑:工作代码,假设每个输入位于单独的行上:

    int tc = Integer.parseInt(scanner.nextLine());
    
    while(true){
        String str="";
        int n = Integer.parseInt(scanner.nextLine());
        String num = scanner.nextLine();
        int cnt = 0;
        for (int i = 0; i < num.length(); i++) {
            int extractedDigit = Integer.parseInt(""+num.charAt(i));
            if(extractedDigit % 2 != 0){
                cnt++;
                str += Integer.toString(extractedDigit);
                if(cnt == 2)break;
            }
            
        }
        if(cnt == 2) System.out.println(str);
        else System.out.println("-1");
        if(tc == 0)break;
        tc--;
    }

试试这个,希望能奏效

 public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String num = scanner.nextLine();
        String str = "";

        int cnt = 0;
        for (int i = 0; i < num.length(); i++) {
            int extractedDigit = Integer.parseInt(Character.toString(num.charAt(i)));
            if (extractedDigit % 2 != 0) {
                cnt++;
                str += Integer.toString(extractedDigit);
                if (cnt == 2) break;
            }
        }
        if (cnt == 2) {
            System.out.println(str);
        } else System.out.println("-1");
    }

试试这个,希望能奏效

 public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String num = scanner.nextLine();
        String str = "";

        int cnt = 0;
        for (int i = 0; i < num.length(); i++) {
            int extractedDigit = Integer.parseInt(Character.toString(num.charAt(i)));
            if (extractedDigit % 2 != 0) {
                cnt++;
                str += Integer.toString(extractedDigit);
                if (cnt == 2) break;
            }
        }
        if (cnt == 2) {
            System.out.println(str);
        } else System.out.println("-1");
    }

很抱歉没有提出传统的方法。这只是让您了解函数式编程如何让您的生活更轻松:

    Scanner sc = new Scanner(System.in);
    String input = sc.nextLine(); // Assuming input = "123456"
    Arrays.stream(input.split("")) // returns ["1","2","3","4","5","6"]
        .map(Integer::parseInt) // returns [1,2,3,4,5,6]
        .filter(num -> num % 2 != 0) // Allows elements that pass num % 2 != 0 predicate 
        .forEach(System.out::print); //prints the elements that passed through the filter
现在,修改以获取计数非常容易

 long oddElementCount = Arrays.stream(input.split("")) // returns ["1","2","3","4","5","6"]
        .map(Integer::parseInt) // returns [1,2,3,4,5,6]
        .filter(num -> num % 2 !=0) // filters all elements that do not satisfy the predicate
        .count(); //prints the count of elements that satisfy the given Predicate (num %2 != 0)
    System.out.println(oddElementCount);

很抱歉没有提出传统的方法。这只是让您了解函数式编程如何让您的生活更轻松:

    Scanner sc = new Scanner(System.in);
    String input = sc.nextLine(); // Assuming input = "123456"
    Arrays.stream(input.split("")) // returns ["1","2","3","4","5","6"]
        .map(Integer::parseInt) // returns [1,2,3,4,5,6]
        .filter(num -> num % 2 != 0) // Allows elements that pass num % 2 != 0 predicate 
        .forEach(System.out::print); //prints the elements that passed through the filter
现在,修改以获取计数非常容易

 long oddElementCount = Arrays.stream(input.split("")) // returns ["1","2","3","4","5","6"]
        .map(Integer::parseInt) // returns [1,2,3,4,5,6]
        .filter(num -> num % 2 !=0) // filters all elements that do not satisfy the predicate
        .count(); //prints the count of elements that satisfy the given Predicate (num %2 != 0)
    System.out.println(oddElementCount);

你应该学习以下东西,这些东西反过来也会解决你的问题:

您可以将Integer.parseIntCharacter.toString.charAti替换为num.charAti-“0”,因为您可以使用与对int执行相同的方式对char执行算术运算,例如,“5”-“2”给出3

我建议您在循环中使用StringBuilder而不是String来进行重复的字符串连接,因为使用String将创建与连接数量一样多的字符串实例。查看以了解更多信息。请注意,您可以将char值直接附加到StringBuilder

即使块体中只有一条语句,也应该养成将块体封闭在{…}中的习惯。这将使您避免一些声明意外地超出范围,例如

if (1 == 2)
    System.out.print("Hello");
    System.out.println("World");

System.out.println("What's up?"); 
将打印

World
What's up?
不仅仅是

What's up?
打印-1不需要用双引号括住-1。 结合所有这些要点,您可以将解决方案编写为

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        StringBuilder str = new StringBuilder();
        String num = scanner.nextLine();
        int cnt = 0;
        for (int i = 0; i < num.length(); i++) {
            int extractedDigit = num.charAt(i) - '0';
            if (extractedDigit % 2 != 0) {
                cnt++;
                str.append(extractedDigit);
                if (cnt == 2) {
                    break;
                }
            }    
        }
        if (cnt == 2) {
            System.out.println(str);
        } else {
            System.out.println(-1);
        }
    }
}

你应该学习以下东西,这些东西反过来也会解决你的问题:

您可以将Integer.parseIntCharacter.toString.charAti替换为num.charAti-“0”,因为您可以使用与对int执行相同的方式对char执行算术运算,例如,“5”-“2”给出3

我建议您在循环中使用StringBuilder而不是String来进行重复的字符串连接,因为使用String将创建与连接数量一样多的字符串实例。查看以了解更多信息。请注意,您可以将char值直接附加到StringBuilder

即使块体中只有一条语句,也应该养成将块体封闭在{…}中的习惯。这将使您避免一些声明意外地超出范围,例如

if (1 == 2)
    System.out.print("Hello");
    System.out.println("World");

System.out.println("What's up?"); 
将打印

World
What's up?
不仅仅是

What's up?
打印-1不需要用双引号括住-1。 结合所有这些要点,您可以将解决方案编写为

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        StringBuilder str = new StringBuilder();
        String num = scanner.nextLine();
        int cnt = 0;
        for (int i = 0; i < num.length(); i++) {
            int extractedDigit = num.charAt(i) - '0';
            if (extractedDigit % 2 != 0) {
                cnt++;
                str.append(extractedDigit);
                if (cnt == 2) {
                    break;
                }
            }    
        }
        if (cnt == 2) {
            System.out.println(str);
        } else {
            System.out.println(-1);
        }
    }
}

数字是任何可能的数字。数字是0,1,2,3,4,5,6,7,8,9中的任意一个。是的,我知道。我写的时候应该更小心。数字是任何可能的数字。数字是0,1,2,3,4,5,6,7,8,9中的任意一个。是的,我知道。我在写作时应该更加小心。请在你的回答中加上一些解释。你也可以读到我的观点,但每当我在
虽然循环,但它不起作用。请在您的答案中添加一些解释。你也可以读到我的观点,但每当我在while循环中使用相同的代码时,它就是不起作用。这对我来说有点困惑。我使用scanner.nextInt获取要检查的数字的位数,scanner.nextLine读取字符串输入。scanner.nextInt不读取整行并将其转换为int,它只读取下一个int,而不关心rest。它说nextInt解析下一个“令牌”。默认情况下,标记由空白字符分隔,空白字符包括空格、制表符和行分隔符。这让我有些困惑。我使用scanner.nextInt获取要检查的数字的位数,scanner.nextLine读取字符串输入。scanner.nextInt不读取整行并将其转换为int,它只读取下一个int,而不关心rest。它说nextInt解析下一个“令牌”。默认情况下,标记由空白字符分隔,空白字符包括空格、制表符和行分隔符。