Что мне не хватает в моем коде? JAVA [закрыт]

Это мой кусок кода. Я использую цикл for для итерации по строке, вытаскивая токен (слово, разделенное пробелом), определяем, является ли это зарезервированным словом или нет, если оно печатает «Зарезервированное слово:», в противном случае оно печатает " Текущее слово: ". Это то, что у меня есть до сих пор, я застрял на том, как сделать работу isKeyWord. Примечание. Я не могу использовать функцию разделения, сканер или токенизатор. Просто цикл for.

public class Week3Project {
    final static String program = "/*
" +
" * To change this license header, choose License Headers in Project Properties.
" +
" * To change this template file, choose Tools | Templates
" +
" * and open the template in the editor.
" +
" */
" +
"package testapplication2;
" +
"
" +
"import java.util.Scanner;
" +
"
" +
"/**
" +
" *
" +
" * @author james
" +
" */
" +
"public class TestApplication2 {
" +
"
" +
"    /**
" +
"     * @param args the command line arguments
" +
"     */
" +
"    public static void main(String[] args) {
" +
"        Scanner input = new Scanner(System.in);
" +
"        
" +
"        System.out.println("Enter integer #1");
" +
"        int num1 = input.nextInt();
" +
"        
" +
"        System.out.println("Enter integer #2");
" +
"        int num2 = input.nextInt();
" +
"        
" +
"        System.out.println("Enter integer #3");
" +
"        int num3 = input.nextInt();
" +
"        
" +
"        System.out.println("Enter integer #4");
" +
"        int num4 = input.nextInt();
" +
"        
" +
"        System.out.println("Enter integer #5");
" +
"        int num5 = input.nextInt();
" +
"        
" +
"        //determine the sum
" +
"        int sum = num1 + num2 + num3 + num4 + num5;
" +
"        
" +
"        //this is helpful to make sure your sum is correct
" +
"        System.out.println("The sum is: " + sum);
" +
"        
" +
"        //why doesn't this generate the sum correctly
" +
"        double average = sum / 5;
" +
"        
" +
"        //The average, lets hope its right...
" +
"        System.out.println("The average of your numbers is: " + average);
" +
"        
" +
"    }
" +
"    
" +
"}
" +
"";


    public static void main(String[] args)
    {
        String str = program;

        String s = "";
        String[] keywords = {"abstract", "assert", "boolean", "break", "byte", "case", "catch", "char", "class", "const", "continue", "default", "do", "double", "else", "enum",
 "extends", "final", "finally", "float", "for", "goto", "if", "implements", "import", "instanceof", "int", "interface", "long", "native", "new", "package", "private", "protected", "public", "return", "short", "static",
 "strictfp", "super", "switch", "synchronized", "this", "throw", "throws", "transient", "try", "void", "volatile", "while"};
        for (int i = 0; i < str.length(); i++) {
            s += str.charAt(i) + "";
            if (str.charAt(i) == ' ' || str.charAt(i) == '	' || str.charAt(i) == '
') {
                String currentWord = s.toString();
                //System.out.println(currentWord);                
                boolean isKeyWord = false; 
                for (int j = 0; j < keywords.length; j++) { 
                    if (currentWord.equalsIgnoreCase(keywords[j])) { 
                        isKeyWord = true;
                    }
                } break; } }
                if (isKeyWord == true) {
                    System.out.println("Reserved word is: ["  + currentWord + "]");
                }
                else {
                    System.out.println("Current word is: [" + currentWord + "]")
                }
                s = "";//Clear the string to get it ready to build next token.


            }
        }

java,string,

-7

Ответов: 3


2 принят
    for (int i = 0; i < str.length(); i++) {
        if (str.charAt(i) == ' ' || str.charAt(i) == '	' || str.charAt(i) == '
') {
            // end of token, check if key word
            String currentWord = s.toString();     
            boolean isKeyword = false       
            for (int j = 0; j < keywords.length; j++) { 
                if (currentWord.equalsIgnoreCase(keywords[j])) { 
                    isKeyword = true;
                    break;
                } 
            }
            if(isKeyword) {
                System.out.println("Reserved word is: ["  + currentWord + "]");
            } else {
                System.out.println("Current word is: [" + currentWord + "]");
            }
            s = "";//Clear the string to get it ready to build next token.
        } else {
            // continue building token
            s += str.charAt(i) + "";
        }
    }

Ваша версия цикла добавляет пробел / табуляцию / новую строку перед проверкой, которая заставляет текущее слово никогда не соответствовать вашим ключевым словам.


0

Во-первых, я, вероятно, переместил бы String[]содержимое keywordsв static finalполе (но я его здесь не вставил, потому что он довольно длинный, и его не нужно менять). Затем, предпочитайте StringBuilderвсе эти конкатенации. И Character.isWhitespace(char)хороший метод для определения того, встретили ли вы пробелы. Что-то вроде

StringBuilder sb = new StringBuilder();
for (int i = 0; i < program.length(); i++) {
    char ch = program.charAt(i);
    if (!Character.isWhitespace(ch)) {
        sb.append(ch);
    } else {
        String token = sb.toString();
        if (token.isEmpty()) {
            continue;
        }
        boolean isKeyWord = false;
        for (String word : keywords) {
            if (word.equals(token)) {
                isKeyWord = true;
                break;
            }
        }
        System.out.printf("%s word is : [%s]%n", 
                isKeyWord ? "Reserved" : "Current", token);
        sb.setLength(0);
    }
}

И, в Java 8+, этот поиск массива может быть выполнен с помощью Arrays.streamи anyMatchт. Д.

boolean isKeyWord = Arrays.stream(keywords).anyMatch(token::equals);

-1

Проверьте, может ли это помочь вам

public static void main(String[] args) {
String[] keywords = {"abstract", "assert", "boolean", "break", "byte", "case", "catch", "char", "class", "const", "continue", "default", "do", "double", "else", "enum",
    "extends", "final", "finally", "float", "for", "goto", "if", "implements", "import", "instanceof", "int", "interface", "long", "native", "new", "package", "private",
    "protected", "public", "return", "short", "static",
    "strictfp", "super", "switch", "synchronized", "this", "throw", "throws", "transient", "try", "void", "volatile", "while"};

 for (String value : keywords) {
   if (program.contains(value)) {
     System.out.println("Reserved word is: [" + value + "]");
   }
 }
}

Мой результат

Зарезервированное слово: [класс]
Зарезервированное слово: [do]
Зарезервированное слово: [double]
Зарезервированное слово: [import]
Зарезервированное слово: [int]
Зарезервированное слово: [новое]
Зарезервированное слово: [package]
Зарезервировано слово is: [public]
Зарезервированное слово: [статическое]
Зарезервированное слово: [this]
Зарезервированное слово: [void]

Java, строка,
Похожие вопросы