AJUDA COM ERRO ArrayIndexOutOfBoundsException

2 respostas
C

Olá galerinha do Portal Java!
Bem, mais uma vez venho pedir sua ajuda :grin:
estou tentando implementar um algoritmo de ordenação chamado COUNTINGSORT e encontro um erro tipo java.lang.ArrayIndexOutOfBoundsException
que não consigo solucionar.
o programinha é composto de duas classes e seque abaixo:

import java.util.Random;
import java.util.Scanner;

public class CountingSortTest
{
    public static void main(String args[])
    {
        //escolhe o tamanho do array
        System.out.println("BEM VINDO AO PROGRAMA DE ORDENAÇÃO COUNTINGSORT.");
        System.out.println("Digite o tamanho do array que você deseja gerar ==>");
        Scanner input = new Scanner(System.in);
        int num = input.nextInt();
        
        //gera o array com números aleatórios
        Random random = new Random();
        int[] vet = new int[num];
        for(int i = 0; i < vet.length; i++)
            vet[i] = random.nextInt(num);  
        CountingSort ordena = new CountingSort(vet);
    }
}
--------------------------------------------------------------------------------------

public class CountingSort
{
    
    private int[] A;    //vetor desorganizado
    private int[] B;    //vetor que conterá os elementos de A ordenados
    private int[] C;    //vetor auxiliar
    int k;              //maior elemento de vet
    int n;              //tamanho de vet
    
    public CountingSort(int[] v)
    {
        A = v;
        n = A.length;
        B = new int[n];
        k = max(A);
        C = new int[k];
        System.out.println("************************************************");
        System.out.println("Array desordenado:");
        print(A);
        System.out.println();
        System.out.println("************************************************");
        countingSort();
        System.out.println("Array ordenado:");
        print(B);
        System.out.println();
        System.out.println("************************************************");
        System.out.println("FIM DO PROGRAMA...");
        
    }
    
    private int max(int[] v)    //acha o maior elemento de vet
    {
        int temp = v[0];
        for(int i = 1; i < v.length; i++)
        {
            if(v[i] > temp)
                temp = v[i];
        }
        return temp;
    }
    
    private void countingSort()
    {
        for(int i = 0; i < k; k++)
            C[i] = 0;
        
        for(int i = 0; i < n; i++)
            C[A[i]] = C[A[i]] + 1;
        
        for(int i = 1; i < k; i++)
            C[i] = C[i] + C[i - 1];
        
        for(int j = n; j >= 0; j--)
        {
            B[C[A[j]]] = A[j];
            C[A[j]] = C[A[j]] - 1;
        }
    }
    
    private void print(int []v) //imprime os elementos de um vetor v qualquer
    {
        for( int p : v)
            System.out.printf("| %d | ", p);
    }
}

[* Editado por: Diana - Use BBCode !]

obrigado!

2 Respostas

D

Bom dia fera…

Não analisei o seu algoritmo, mas, esse erro 'java.lang.ArrayIndexOutOfBoundsException ’
diz basicamente q. em alguma parte vc está tentando usar uma posição inválida do array…por exemplo:
Objeto[] obj = new Objeto[5];
vai de obj[0] até obj[4]…se vc tentar usar o obj[5] receberá a exceção de cima.

espero ter ajudado… :wink:

t+

C

Valeu a ajuda Diana!
Tem coisas que é preciso começar do zero outra vez pra poder concertar!
Foi isso que fiz e agora acertei :grin:
seque o código correto:

import java.util.Random;
import java.util.Scanner;

public class CountingSort2
{

public static void main(String args[])
{
    CountingSort2 ord = new CountingSort2();
    ord.test();
}

public void test()
{
    System.out.println("BEM VINDO AO PROGRAMA DE ORDENAÇÃO COUNTINGSORT.");
    System.out.println("Digite o tamanho do array que você deseja gerar ==&gt;");
    Scanner input = new Scanner(System.in);
    int num = input.nextInt();
    
    //gera o array com números aleatórios
    Random random = new Random();
    int[] a = new int[num];
    for(int i = 0; i &lt; a.length; i++)
        a[i] = random.nextInt(num);  
    
    //imprime a antes da ordenação
    System.out.println("ARRAY DESORDENADO:");
    for (int i = 0; i &lt; a.length; i++)
        System.out.printf("| %d |", a[i]);
    System.out.println("");
    
    //calcula o tamanho do vetor auxiliar
    //que será o maior elemento de a + 1
    int m   = max(a) + 1;
    a = sort(a, m);
  
    //imprime a depois da ordenação
    System.out.println("ARRAY ORDENADO:");
    for (int i = 0; i &lt; a.length; i++)
        System.out.printf("| %d |", a[i]);
    System.out.println("");
}


public int[] sort(int a[], int m)
{
    int temp[] = new int[m];

    //initialize
    for (int i = 0; i &lt; m; i++)
        temp[i] = 0;

    for (int i = 0; i &lt; a.length; i++)
        temp[a[i]] += 1;

    // sort (overwrite a)
    int pos = 0;
    for (int i = 0; i &lt; temp.length; i++)
    {
        int count = temp[i];
        for (int j = 0; j &lt; count; j++)
        {
            a[pos] = i;
            pos++;
        }
    }
    return a;

}

private int max(int[] v)    //acha o maior elemento de vet
{
    int temp = v[0];
    for(int i = 1; i &lt; v.length; i++)
    {
        if(v[i] &gt; temp)
            temp = v[i];
    }
    return temp;
}

}

Criado 5 de setembro de 2007
Ultima resposta 5 de set. de 2007
Respostas 2
Participantes 2