Tempo de execução

Ao calcular o tempo de execução do método de ordenação e, posteriormente, converter o tempo de long para int, surge o erro Cannot invoke toString( ) on the primitive type long. Alguém tem ideia do que como possa resolver?

public class MyMergeSort  {  
void merge(int arr[], int beg, int mid, int end)  
{  
  
  int l = mid - beg + 1;  
  int r = end - mid;  
  
  int LeftArray[] = new int [l];  
  int RightArray[] = new int [r];  
  
    for (int i=0; i<l; ++i)  
      LeftArray[i] = arr[beg + i];  
  
    for (int j=0; j<r; ++j)  
      RightArray[j] = arr[mid + 1+ j];  
  
  int i = 0, j = 0;  
  int k = beg;  
    while (i<l&&j<r)  {  
      if (LeftArray[i] <= RightArray[j]) {  
        arr[k] = LeftArray[i];  
        i++;  
      }  
      else {  
        arr[k] = RightArray[j];  
        j++;  
      }  
      k++;  
    }  
    while (i<l) {  
      arr[k] = LeftArray[i];  
      i++;  
     k++;  
    }  
  
    while (j<r) {  
      arr[k] = RightArray[j];  
      j++;  
      k++;  
    }  
}  
  
  public int sort(int arr[], int beg, int end) {  
    if (beg<end)  {
      long start = System.currentTimeMillis();
      int mid = (beg+end)/2;  
      sort(arr, beg, mid);
      sort(arr , mid+1, end);
      merge(arr, beg, mid, end);
      long ended = System.currentTimeMillis();
      long all = ended-start;
      Integer all1 = 0;
      try{
        all1 = Integer.valueOf(all.toString()); 
      }
      catch (Exception e) {   
        System.out.println("Capacidade do Integer estourou.");   
      }  
      return all1;
    }  
  }  
  public static void main(String args[])  {
    int size = 10;
    int arr[] = new int[size];
    for(int i=0; i<arr.length; i++) {
      arr[i] = (int)(1+Math.random()*size);
    }
    MyMergeSort ob = new MyMergeSort();
    ob.sort(arr, 0, arr.length-1);
    System.out.println("\nSorted ");  
    for(int i =0; i<arr.length;i++)  {  
        System.out.println(arr[i]+"");  
    }
  }  
}
1 curtida

A mensagem é clara: o tipo primitivo long não tem um método toString(). Você não está confundindo com a classe Long?

De todo modo, não entendi bem o motivo dessa conversão de long para int. Não é mais fácil fazer o método retornar long?

public long sort(int arr[], int beg, int end) {  
    if (beg<end)  {
      long start = System.currentTimeMillis();
      int mid = (beg+end)/2;  
      sort(arr, beg, mid);
      sort(arr , mid+1, end);
      merge(arr, beg, mid, end);
      long ended = System.currentTimeMillis();
      long all = ended-start;
      return all;
    }  
  }

Abraço.

1 curtida

A princípio, fiz da forma que você expôs. Mas quando tentei simplesmente retornar all apareceu um erro dizendo que não era possível converter de long para int. Daí a razão de eu ter tentado converter de long para int. Assim, o único erro que aparece é na conversão.

1 curtida

Qual o erro e em qual linha? Você notou que é preciso mudar a declaração do método?

public long sort(int arr[], int beg, int end) {  // agora é long, não mais int

Abraço.

1 curtida

Um long comporta 64 bits.
Um int comporta somente 32 bits.
Você terá de truncar o long para int fazendo um cast, assim:

int all1 = (int) all;

Algum motivo especial para estar usando Integer ao invés de int?

1 curtida