2012-12-08 18 views
5

Zostałem za zadanie przekształcenie tego kodu w rodzaj odwrotny, ale z mojego życia nie mogę wymyślić, jak to zrobić. Są to moje rodzaje, najłatwiejsze i metody zamiany. Mam przeczucie, że brakuje mi czegoś oczywistego tutaj, każda pomoc będzie naprawdę doceniona.Sortowanie tablicy łańcuchów znaków w odwrotnej kolejności alfabetycznej w Javie

public static void sort(String[] arr) 
    { 
     for (int pass = 1; pass < arr.length; pass++) 
     { 
      int largestPos = findLargest(arr, arr.length - pass); 
      if (largestPos != arr.length - pass) 
      { 
       swap(arr, largestPos, arr.length - pass); 
      } 
     } 
    } 

    public static int findLargest(String[] arr, int num) 
    { 
     int largestPos = 0; 
     for (int i = 1; i <= num; i++) 
     { 
      if (arr[i].compareToIgnoreCase(arr[largestPos]) > 0) 
      { 
       largestPos = i; 
      } 
     } 
     return largestPos; 
    } 

    public static void swap(String[] arr, int first, int second) 
    { 
     String temp = arr[first]; 
     arr[first] = arr[second]; 
     arr[second] = temp; 
    } 
} 
+2

Czy można używać kolekcji i listy ArrayList? –

+1

Tylko mały komentarz: Tablice w Javie zaczynają się od indeksu 0, a nie 1. – str

+0

@str OP nie musi sprawdzać, czy 'arr [0]> arr [0]'; rozpoczęcie kontroli w indeksie 1 jest w porządku. – irrelephant

Odpowiedz

1

możesz użyć Arrays.sort(arr) do sortowania w kolejności alfabetycznej.

, a następnie odwróć go.

+4

(co jest przeciwieństwem zadania.) –

+0

edytował odpowiedź, będzie musiał odwrócić tablicę. – Subin

+1

Użyj dwuargumentowego Arrays.sort i przekaż 'Collections.reverseOrder()' jako komparator. –

3

można po prostu włączyć findLargest do findSmallest, tak:

public static void sort(String[] arr) { 
    for (int pass = 1; pass < arr.length; pass++) { 
     int largestPos = findSmallest(arr, arr.length - pass); 
     if (largestPos != arr.length - pass) { 
      swap(arr, largestPos, arr.length - pass); 
     } 
    } 
} 

public static int findSmallest(String[] arr, int num) { 
    int largestPos = 0; 
    for (int i = 1; i <= num; i++) { 
     if (arr[i].compareToIgnoreCase(arr[largestPos]) < 0) { 
      largestPos = i; 
     } 
    } 
    return largestPos; 
} 

public static void swap(String[] arr, int first, int second) { 
    String temp = arr[first]; 
    arr[first] = arr[second]; 
    arr[second] = temp; 
} 
1
public static void sort(String[] arr) { 
    Arrays.sort(arr); 
    for (int i=0; i<arr.length/2; i++) { 
     swap(arr,i,arr.length-1-i); 
    } 
} 

Spróbuj tego, jeśli chcesz. W twojej wersji przesuwasz największy pod koniec tablicy, co prowadzi do porządku alfabetycznego.

wszelki wypadek nalegać na swoim oryginalnym podejściem, zrobiłem kilka drobnych zmian w kodzie:

public static void sort(String[] arr) 
{ 
    for (int pass = 1; pass < arr.length; pass++) 
    { 
     int largestPos = findLargest(arr, pass-1); 
     if (largestPos != pass - 1) 
     { 
      swap(arr, largestPos, pass - 1); 
     } 
    } 
} 

public static int findLargest(String[] arr, int num) 
{ 
    int largestPos = num; 
    for (int i = num+1; i < arr.length; i++) 
    { 
     if (arr[i].compareToIgnoreCase(arr[largestPos]) > 0) 
     { 
      largestPos = i; 
     } 
    } 
    return largestPos; 
} 

najbardziej trywialne jeden chociaż, jak sugeruje Ian Roberts, jest po prostu Arrays.sort(arr, Collections.reverseOrder());.

1

Myślę, że to jest to, czego potrzebujesz (jeśli nie myślisz o strukturze kolekcji).

public static void main(String args[]) { 


    String [] arr ={"abc","bac","cbc"}; 
      String temp=""; 

    for(int i=0;i<arr.length;i++){ 

     for(int j=i+1;j<arr.length;j++){ 

      if(arr[j].compareTo(arr[i]) > 0){ 

       temp = arr[i] ; 
       arr[i] = arr[j]; 
       arr[j] = temp; 
      } 
     } 

    } 

    for(String val:arr){ 
     System.out.println(val); 
    } 

} 

Wyjście jest

cbc 
bac 
abc 
5

Nie wyważać otwartych drzwi -

String[] strs = {"a", "b", "d", "c", "e"}; 

Arrays.sort(strs, Collections.reverseOrder(String.CASE_INSENSITIVE_ORDER)); 

System.out.println(Arrays.toString(strs)); 
 
[e, d, c, b, a] 
+1

To wydaje się najbardziej eleganckie, ale zauważam, że kod chce porównać ciągi ignorujące przypadek. Więc zamiast Collections.reverseOrder() potrzebujesz niestandardowego komparatora. – bowmore

+2

@bowmore możesz użyć 'Collections.reverseOrder (String.CASE_INSENSITIVE_ORDER)' do tego, bez potrzeby implementowania niestandardowego. –

+0

@IanRoberts Thanks - zaktualizowałem moją odpowiedź. – arshajii

3

następczych ARS za odpowiedź:

Można użyć niestandardowego komparator, jeśli wolno używać t on Arrays.Sort metodę ...

Arrays.sort(stringArray, new Comparator<String>() { 
      @Override 
      public int compare(String t, String t1) { 
       return -t.compareToIgnoreCase(t1); //reverse the comparison, while ignoring case 
      } 
     }); 
1

Więc, najpierw musimy stworzyć tablicę ciągów, a następnie użyć Arrays.sort(String[]);, a następnie użyć for odwrócić tablicę sortowania, aby odwrócić kolejność.

import java.util.Arrays; 

public class SortClass { 
    public static void main(String[] args) { 
     String[] arrayString = new String[5]; 
     arrayString[0] = "Cat"; 
     arrayString[1] = "Apple"; 
     arrayString[2] = "Dog"; 
     arrayString[3] = "Mouse"; 
     arrayString[4] = "kitchen"; 
     Arrays.sort(arrayString); 
     String[] arrReverse = new String[arrayString.length]; 
     for (int i = arrayString.length - 1; i >= 0; i--) { 
      arrReverse[arrayString.length - 1 - i] = arrayString[i]; 

     } 
    } 
} 
Powiązane problemy