Рассчитать очки по буквам в коммутаторе - PullRequest
0 голосов
/ 30 мая 2019

Я пытаюсь создать программу, похожую на скраббл, которая вычисляет точки букв, содержащиеся в слове. Эти слова содержатся в файле .txt. Я могу заставить его читать из файла, но не знаю, как заставить его вычислить значение каждого слова. Я приложил то, что я сделал до сих пор, и мне интересно, является ли регистр переключения лучшим способом, и если да, то как мне присвоить значение букве с регистром переключения. Любая помощь приветствуется.

/*
 * 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 pointsproblem;

/**
 *
 */

import java.util.Scanner;
import java.io.File;
import java.io.FileNotFoundException;

 public class PointsProblem {

/**
 * @param args the command line arguments
 * @throws java.io.FileNotFoundException
 */
 public static void main(String[] args) throws FileNotFoundException {
    // TODO code application logic here

    //create new object//        
    PointsProblem task1 = new PointsProblem();  

    File file = new File("dictionary.txt");  
    // read the file//
    Scanner input = new Scanner(file);

    //check if file can be found//
    if (!file.isFile()) {
        System.err.println("Cannot open file: " + input);
        System.exit(0);
    }
    else {
        System.out.println("Successfully opened file: " + input + ".");
    }   
    //read all the lines in the file//
   {
        while (input.hasNext()) {
            String word = input.nextLine();
            System.out.println(word);
            System.out.println("'" + input + "' is worth " + point + " points");



    int point = "";
    switch(point)  {


    case 'a': = "1":
    case 'e': = "1";
    case 'i': = "1";
    case 'l': = "1";
    case 'n': = "1";
    case 'o': = "1";
    case 'r': = "1";
    case 's': = "1";
    case 't': = "1";
    case 'u': = "1";
    case 'g': = "2";
    case 'g': = "2";
    case 'b': = "3";
    case 'm': = "3";
    case 'c': = "3";
    case 'p': = "3";
    case 'f': = "4";
    case 'h': = "4";
    case 'v': = "4";
    case 'w': = "4";
    case 'y': = "4";
    case 'k': = "5";
    case 'j': = "8";
    case 'x': = "8";
    case 'q': = "10";
    case 'z': = "10";                            

    return score  =  point + "";
        }//end switch

     }//end point calculation loop

    public int getScore() {
        return score;
    }
    //public boolean containsLetter(Character letter) {
        //return points.contains(letter);//

    }

Я также пытался присвоить int значения X. Я хотел бы, чтобы он прочитал слово, содержащееся в файле, и дал общий балл.

Ответы [ 5 ]

1 голос
/ 30 мая 2019

Похоже, что Map<Character, Integer> будет соответствовать:

public class PointsProblem {
    final Map<Character, Integer> pointsMap = Map.of(
        'a', 1,
        'e', 1,
        //.......
        'z', 10
    );

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

int wordPoints = 0;
for(char c : word.toCharArray())
    wordPoints += pointsMap.get(c);
0 голосов
/ 01 июня 2019

Спасибо всем, в итоге я получил следующий код, который выдает результат, который мне нужен:

  System.out.println("Points problem");

             File file = new File("dictionary.txt");
    // read the file//
    Scanner input = new Scanner(file);

    //check if file can be found//
    if (!file.isFile()) {
        System.err.println("Cannot open file: " + file);
        System.exit(0);
    } else {
        System.out.println("Successfully opened file: " + file + ".");
    }
    //read all the lines in the file//

    while (input.hasNext()) {
        String word = input.nextLine();
        //System.out.println(word);
        int l = word.length();
        int point = 0;
        for (int x = 0; x < l; x++) {
            char c = word.charAt(x);                
            switch (c) {

                case 'a':
                case 'e':
                case 'i':
                case 'l':
                case 'n':
                case 'o':
                case 'r':
                case 's':
                case 't':
                case 'u':
                    point += 1;
                    break;

                case 'd':
                case 'g':
                    point += 2;
                    break;

                case 'b':
                case 'c':
                case 'm':
                case 'p':
                    point += 3;
                    break;

                case 'f':
                case 'h':
                case 'v':
                case 'w':
                case 'y':
                    point += 4;
                    break;

                case 'k':
                    point += 5;
                    break;

                case 'j':
                case 'x':    
                    point += 8;
                    break;

                case 'q':                        
                case 'z':
                    point += 10;
                    break;                       
            }//end switch*/
        }//end point calculation loop         
        System.out.println(word + "is worth " + point + " points." );
    }
0 голосов
/ 31 мая 2019

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

    int calcScore(String str)
    {
        int score = 0;
        for(int i=0; i<str.length(); i++)
        {
        switch(str.charAt(i))  {
            case 'a':  
            case 'e': 
            case 'i': 
            case 'l': 
            case 'n': 
            case 'o': 
            case 'r': 
            case 's': 
            case 't': 
            case 'u': score += 1; break;
            case 'g': score += 2; break;
            case 'b': 
            case 'm': 
            case 'c': 
            case 'p': score += 3; break;
            case 'f': 
            case 'h': 
            case 'v': 
            case 'w': 
            case 'y': score += 4; break;
            case 'k': score += 5; break;
            case 'j': 
            case 'x': score += 8; break;
            case 'q': 
            case 'z': score += 10; break;                          
            }
    }
        return score;
 }

Эта функция может вызываться для каждого слова.

0 голосов
/ 30 мая 2019

Используйте карту для хранения значений:

Map<Character, Integer> charValues = new HashMap();
charValues.put('a', 2);
charValues.put('b', 1);

Вы можете использовать символы () и собирать как сумму

int total = word.chars()
                .mapToObj(c -> charValues.get((char)c))
                .mapToInt(i -> (int)i)
                .sum();

Но в соответствии с вашим вариантом использования вы можете подсчитатьсначала используйте символы, а затем умножьте

  Map<Character, Integer> counter = new HashMap<>();
  while (input.hasNext()) {
     String word = input.next();
     word.chars().forEach(c -> counter.compute(c, (k, v) -> v == null ? 1 : v + 1));
  }

counter.entrySet()
       .stream()
       .mapToInt(e -> charValues.get(e.getKey())*e.getValue())
       .sum();

, если вы используете переключатель, ваш код будет выглядеть так:

int total = 0;

switch (c){
      case 'a' : total += 1; break;
      case 'b' : total += 2; break;
}
0 голосов
/ 30 мая 2019

Я не уверен, что код, который вы нам показали, скомпилируется. Есть несколько вещей, которые нужно изменить;

1) Вы устанавливаете String для int. Вы хотите изменить это на

int point = 0

2) Вы ничего не устанавливаете в операторе switch

Изменить case 'a': = "1": на case 'a': point = 1;

3) Вы никогда не установите уникальное значение в операторе switch, потому что вы не используете break Закажите эту страницу для хорошего урока: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html

По сути, без каких-либо операторов break ваш код будет проходить через операторы, а точка будет просто назначена вашему последнему случаю. Вы хотите иметь что-то вроде

switch(char)  {
    case 'a': point = 1;
        break;
    case 'e': point = 1;
        break;
    // etc.
    default: point = 1;  // maybe throw an error or add some logging for the default case
         break;
}
return point;

Я предполагаю, что у вас действительно есть этот оператор switch в его собственном методе, а не в main, как вы показали нам выше, иначе оператор return вам не поможет. Вы также можете сократить это так, чтобы каждый случай просто возвращал значение (опять же, если это в его собственном методе), т.е.

switch(char) {
    case 'a': return 1;
    case 'b': return 1;
    // etc.
}

редактирование:

Лучший способ получить значение точки всего слова с помощью оператора switch:

char[] chars = word.toCharArray();
int point=0;
for (char c: chars) {
    switch(c) {
        case 'a':
            point += 1;
            break;
        // etc.
    }
}
System.out.println("Total point value of word '" + word + "' was " + point);
...