Ошибка IndexOutOfBounds Java с конструктором, методом, массивом и объектом - PullRequest
0 голосов
/ 23 января 2019

Напишите класс с именем SameEnds. Напишите SameEndsTester, чтобы проверить свой класс. SameEnds определяет, имеет ли array list одинаковую последовательность чисел слева и в конце, и если да, то какова длина этой последовательности. Вы не будете запрашивать у пользователя данные. Введите данные теста с помощью конструктора SameEnds из SameEndsTester. Вы можете предположить, что все элементы в array list являются целыми числами.

For example, the array list
1 4 9 10 11 12 1 4 9

имеет одинаковую последовательность 1 4 9 слева и справа и имеет length 3. Следовательно, ваш SameEndsTester напечатает “The longest sequence is 1 4 9, and the sequence length is 3”. Если arraylist не имеет общей последовательности слева и справа, например

1 4 9 16 25

SameEndsTester должен распечатать «Нет общих последовательностей». Две последовательности не могут перекрываться. Например, в массиве

1 1 1 1

последовательность 1 1 происходит слева и справа, и ваш метод должен вернуть “The longest sequence is 1 1, and the sequence length is 2”.

Чтобы просмотреть вопрос и увидеть работу проще или увидеть его ниже

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

public class SameEnds {
    Scanner scan = new Scanner(System.in);
    private ArrayList<Integer> nums; // for list of names

    public SameEnds(ArrayList<Integer> nums) {
        this.nums = nums;
    }

    public void testEnds() {
        String data = "";
        for (int i = 0; i < nums.size(); i++)
            if (nums.get(i) == nums.get(nums.size() - i))
                data += nums.get(i) + " ";
        System.out.println("The longest sequence is + " + data);
    }

    @Override
    public String toString() {
        return "SameEnds [nums=" + nums + "]";
    }

}

import java.util.ArrayList;

public class SameEndsTester {

public static void main(String[] args) {
    //  int [] inta = {1,2,3,4,1,2};
        ArrayList<Integer> ali = new ArrayList<Integer>();
        ali.add(1);
        ali.add(2);
        ali.add(3);
        ali.add(4);
        ali.add(1);
        ali.add(2);
        SameEnds typeNum = new SameEnds(ali);
        typeNum.testEnds();
        System.out.print(typeNum);

        }
    }

IndexOutOfBoundsException Image

Пожалуйста, помогите мне решить эту конкретную проблему и весь вопрос.

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Использование строк и потока может помочь.

Это должно работать:

public ArrayList<Integer> findLongestPrefixSameAsPostfix(){

    String asString = String.join("", nums.stream().map(num -> num.toString()).toArray(String[]::new));

    String prefix = "";
    for(int i = 0 ; i < nums.size() ; i++){
        prefix = asString.substring(0, i);
        if(!asString.endsWith(prefix)){
            break;
        }
    }

    return nums.subList(0, prefix.length());
}
0 голосов
/ 23 января 2019

Исключение IndexOutOfBounds наступает из-за

nums.get(nums.size() - i) // When i = 0

Изменение его на приведенный ниже код должно исправить это:

nums.get(nums.size() - (i + 1))
...