Nano Hash - криптовалюты, майнинг, программирование

Получение ошибки при построении строк и добавлении их в ArrayList

Я работаю над окончательным проектом, и вот информация о проекте и ошибках, которые я получаю:

Мы должны смоделировать форму жизни по имени compAlien и посмотреть, как они реагируют друг на друга. Эти инопланетяне создаются с помощью генетического кода длиной 128 символов, состоящего только из букв X, Y или Z.

Согласно паре правил, мы должны вычислить и найти такую ​​информацию об этих инопланетянах (например, если в генетическом коде есть 20 X, цвет глаз становится голубым и т. д.), создать строку, содержащую эту информацию, и его в ArrayList. Мне удалось создать код (приведенный ниже), но в большинстве случаев, когда я пытаюсь создать несколько инопланетян, я всегда получаю сообщение об ошибке:

 Exception in thread "main" java.lang.StringIndexOutOfBoundsException:
 String index out of range: 128     at
 java.base/java.lang.StringLatin1.charAt(StringLatin1.java:48)  at
 java.base/java.lang.String.charAt(String.java:709)     at
 compAlien.calculateHealth(compAlien.java:75)   at
 compAlien.generateCompAlienInfos(compAlien.java:34)    at
 compAlien.main(compAlien.java:193)

Вот код, который я смог написать:

import java.util.Scanner;
import java.util.ArrayList;

public class compAlien {
    
    static Scanner input = new Scanner(System.in);
    static ArrayList<String> compAlienInfos = new ArrayList<String>();
    static String geneticCode = "";
    static String compAlienInfo = "";
    static int colonySize = 0;
    static int count = 0;
    
    public static void generateGeneticCode() { //Method for creating the genetic codes of the compAliens.
            
        for(int i = 0; i < 128; i++) {
            
            char geneticCodeChar = (char) ('X' + Math.random() * ('Z' - 'X' + 1));
            geneticCode += geneticCodeChar;
            
        }
        
    }
    
    public static void generateCompAlienInfos() { //Method for creating all the info of the compAliens, assigning them an ID and adding their info to the compAlienInfos ArrayList.
        
        while(count < colonySize) {
            
            geneticCode = "";
            compAlienInfo = "";
            compAlienInfo += "ID:" + (count + 1) + ", ";
            
            generateGeneticCode();
            findGender();
            calculateHealth();
            findSkinTone();
            findEyeColor();
            
            compAlienInfos.add(compAlienInfo);
            System.out.println(compAlienInfo);
            count ++;
            
        }
        
    }
    
    public static void findGender() { //Method for finding the gender of the compAliens.
        
        if(geneticCode.charAt(127) == 'X') {
            
            compAlienInfo += "Gender: Female, ";
            
        }
        
        else if(geneticCode.charAt(127) == 'Y') {
            
            compAlienInfo += "Gender: Male, ";
            
        }
            
        else {
            
            compAlienInfo += "Gender: Female, ";
            
        }   
        
    }
    
    public static void calculateHealth() { //Method for calculating the health of the compAliens.
        
        int health = 1;
        int i = 0;
        
        while(i < 127) {
            
        if(geneticCode.charAt(i) == 'Y' && geneticCode.charAt(i + 1) == 'X' && geneticCode.charAt(i + 2) == 'Z') {
            
            health ++;
        
            }
        
        i++;
        
        }
        
        compAlienInfo += "Health: " + health + ", ";
        
    }
    
    public static void findEyeColor() { //Method for finding the eye color of the compAliens.
        
        int xCount = 0;
        
        for(int i = 0; i < 128; i++) {
            
            if(geneticCode.charAt(i) == 'X') {
                
                xCount ++;
                
            }
            
        }
        
        if(xCount <= 10) {
            
            compAlienInfo += "Eye Color: Green";
            
        }
        
        else if (10 < xCount && xCount <= 25) {
            
            compAlienInfo += "Eye Color: Blue";
            
        }
        
        else {
            
            compAlienInfo += "Eye Color: Brown";
            
        }
        
    }
    
    public static void findSkinTone() { //Method for finding the skin tone of the compAliens.
        
        int yCount = 0;
        
        for(int i = 0; i < 128; i++) {
            
            if(geneticCode.charAt(i) == 'Y') {
                
                yCount ++;
                
            }
            
        }
        
        if(20 <= yCount && yCount < 30) {
            
            compAlienInfo += "Skin Tone: Red ";
            
        }
        
        else if (30 <= yCount && yCount <= 40) {
            
            compAlienInfo += "Skin Tone: Green, ";
            
        }
        
        else {
            
            compAlienInfo += "Skin Tone: Orange, ";
            
        }
        
    }

    public static void main(String[] args) {
        
        System.out.println("Enter the population size of the compAlien colony: ");
        colonySize = input.nextInt();
        
        System.out.println("Simulating the compAlien colony...");
        generateCompAlienInfos();

    }
    
}

Ответы:


1

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

if (geneticCode.charAt(i) == 'Y' && geneticCode.charAt(i + 1) == 'X' && geneticCode.charAt(i + 2) == 'Z')
12.01.2021
  • Спасибо за ответ. Я думал, что создание i ‹ 127 будет работать, поскольку длина строки составляет 128 символов, а когда i равно 126, она будет искать 126-й, 127-й и 128-й символы, но я забыл, что индекс для строки начинается с 0. Изменение этого 127 на 126 исправил проблему :) 13.01.2021
  • Ю.в. В качестве будущего улучшения вы можете сделать if (i < geneticCode.length()), чтобы всегда гарантировать, что i меньше длины строки. 13.01.2021
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

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

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..