2015-12-14 3 views
2

Я пытаюсь сортировать список массива на основе имени в алфавитном порядке, который содержит тип, имя, URL и дату. Я получил информацию от Browser.BookmarkColumns за исключением типа.Как отсортировать список массивов из a-z?

До:

Default Browser Google  www.Google.com  14/12/2013 
Default Browser BBC  www.BBC.com  13/12/2015 
Default Browser Amazon  www.Amazon.com  11/11/2014 

После:

Default Browser Amazon  www.Amazon.com  11/11/2014 
Default Browser BBC  www.BBC.com  13/12/2015 
Default Browser Google  www.Google.com  14/12/2013 

Вот что я пытался, но он не работает.

int j = mCur.getCount(); 
String[] mType = new String[j]; 
String[] mTitles = new String[j]; 
String[] murls = new String[j]; 
long[] date = new long[j]; 

for (int q=0; q<(j-1); q++) { 
       String a = (mTitles[q]).toLowerCase(); 
       String b = (mTitles[q+1].toLowerCase()); 

       char[] c = a.toCharArray(); 
       char[] d = b.toCharArray(); 

       String temp, temp2, temp3 = null; 
       long temp4 = 0; 

       int lenc = c.length; 
       int lend = d.length; 
       int min =0; 
       int count =0; 

       if (lenc < lend) 
        min = lenc; 
       else 
        min = lend; 

        if (c[count] > d[count]) { 
         temp = mTitles[count]; 
         temp2 = mType[count]; 
         temp3 = murls[count]; 
         temp4 = date[count]; 

         mTitles[count] = mTitles[count + 1]; 
         mType[count] = mType[count + 1]; 
         murls[count] = murls[count + 1]; 
         date[count] = date[count + 1]; 

         mTitles[count + 1] = temp; 
         mType[count + 1] = temp2; 
         murls[count + 1] = temp3; 
         date[count + 1] = temp4; 
        } else if (c[count] == d[count]) { 
         for (int w = 1; w < min; w++) { 
          if (c[w] > d[w]) { 
           temp = mTitles[w]; 
           temp2 = mType[w]; 
           temp3 = murls[w]; 
           temp4 = date[w]; 

           mTitles[w] = mTitles[w + 1]; 
           mType[w] = mType[w + 1]; 
           murls[w] = murls[w + 1]; 
           date[w] = date[w + 1]; 

           mTitles[w + 1] = temp; 
           mType[w + 1] = temp2; 
           murls[w + 1] = temp3; 
           date[w + 1] = temp4; 
          } 
         } 
        } 
      } 
+0

Use Collections.sort (list); –

+0

У вас есть более конкретная ссылка? – Dave

+0

Используйте 'ArrayList' вместо простого массива, вы можете использовать' Collections.sort (arrayList) 'с' ArrayList'. –

ответ

3

Выше ответы дают лучший пример для эффективного списка сортировки массива в Java.

Перед этим, пожалуйста, прочитайте описание упомянутого выше ответ here

Я просто упростил выше ответа для вашего лучшего понимания, что дает точный результат, что у требуется.

ArrayList<UserContainer> userList = new ArrayList<>(); 
    userList.add(new UserContainer("www.Google.com", "Google", "14/12/2013")); 
    userList.add(new UserContainer("www.BBC.com", "BBC", "13/12/2015")); 
    userList.add(new UserContainer("www.Amazon.com", "Amazon", "11/11/2014")); 

    Log.i("Before Sorting :", "==========================>>"); 
    for (UserContainer obj : userList) { 
     System.out.println("Default Browser: \t" + obj.name + "\t" + obj.date + "\t" + obj.webSite); 
    } 

    Collections.sort(userList, new Comparator<UserContainer>() { 
     @Override 
     public int compare(UserContainer first, UserContainer second) { 
      return first.name.compareToIgnoreCase(second.name); 
     } 
    }); 


    Log.i("After Sorting :", "==========================>>"); 
    for (UserContainer obj : userList) { 
     System.out.println("Default Browser: \t" + obj.name + "\t" + obj.date + "\t" + obj.webSite); 
    } 

Модель Класс:

public class UserContainer { 
    public UserContainer(String webSite, String name, String date) { 
     this.webSite = webSite; 
     this.name = name; 
     this.date = date; 
    } 

    public String webSite = ""; 
    public String name = ""; 
    public String date = ""; 
} 
+0

как я могу сортировать его по дате вместо этого? date длинный тип не String. – Dave

+0

Long.valueOf (date) .compareTo (Long.valueOf (date2)) – Than

+0

В классе модели я объявляю «long date = 0;». В моем основном методе сравнения Collections.sort (userList2, новый Comparator () {public int compare (HistoryDetails date, HistoryDetails date2) {return Long.valueOf (date) .compareTo (Long.valueOf (date2));} }); Тем не менее, я получил ошибку «can not resolve method» valueOf ». – Dave

3

Прежде всего, это было бы гораздо проще задача, если вместо сортировки 3 строковых массивов + длинный массив, инкапсулировать все поля и создать класс (назовем его MyData), содержащий все четыре поля. Затем вы можете использовать все новые объекты создания в некоторой коллекции (например, ArrayList).

Итак, если у вас есть ArrayList<MyData>, вы можете использовать Collections.sort, передавая как ваш список, так и реализацию интерфейса Comparator<T>, где будет вся логика сортировки.

Например, если вы хотите отсортировать весь список, используя только String title поле может выглядеть следующим образом:

Comparator<MyData> с реализованы функции сравнения compare(MyData o1, MyData o2){return o1.title.compareTo(o2);

0

Мой совет, чтобы создать собственный список массива.

private ArrayList<UserContainer> userList=new ArrayList<UserContainer>(); 
UserContainer usercontainer=new UserContainer() 
usercontainer.name=Amazon; 
usercontainer.date=11/11/2014; 
userList.add(usercontainer); 


UserContainer usercontainer2=new UserContainer() 
usercontainer.name=Google; 
usercontainer.date=11/11/2014; 
userList.add(usercontainer); 

UserContainer usercontainer3=new UserContainer() 
usercontainer.name=BBC; 
usercontainer.date=11/11/2014; 
userList.add(usercontainer); 

Collections.sort(userList, new Comparator<UserContainer>() { 
     @Override 
     public int compare(UserContainer s1, UserContainer s2) { 
      return s1.name.compareToIgnoreCase(s2.name); 
     } 
    }); 

Модель: -

public class UserContainer { 
public String name = ""; 
public String date = ""; 

}

Я надеюсь, чтобы помочь вам.

0

Создайте класс и используйте компаратор или сопоставимый.

для дальнейшего использования, пожалуйста, проверьте (How to sort an ArrayList in Java)

0

Arrays.sort (StringArray); Его хороший способ сортировки.

Я рекомендую вам создать объект, например «BrowserStoredData» для каждого элемента списка.С строк требуется:

public class BrowserStoredData implements Comparable<BrowserStoredData> { 

    String browserType; 
    String browserName; 
    String browserUrl; 
    String browserDate; 

    public BrowserStoredData(String browserType, String browserName, 
      String browserUrl, String browserDate) { 
     super(); 
     this.browserType = browserType; 
     this.browserName = browserName; 
     this.browserUrl = browserUrl; 
     this.browserDate = browserDate; 
    } 

    public int compareTo(BrowserStoredData bsd) { 
     return (this.browserName).compareTo(bsd.browserName); 
    } 

    @Override 
    public String toString() { 
     return browserType + "\t\t" + browserName + "\t\t" + browserUrl 
       + "\t\t" + browserDate; 
    } 
} 

С этого объекта вы можете легко заказать список BrowserStoredData объектов, просто используя Collections.sort (yourList)

Например:

BrowserStoredData bsd1 = new BrowserStoredData("Default Browser", "Google", "www.Google.com", "14/12/2013"); 
    BrowserStoredData bsd2 = new BrowserStoredData("Default Browser", "BBC", "www.BBC.com", "13/12/2015"); 
    BrowserStoredData bsd3 = new BrowserStoredData("Default Browser", "Amazon", "www.Amazon.com", "11/11/2014"); 

    List<BrowserStoredData> listBrowsers = new ArrayList<BrowserStoredData>(); 
    listBrowsers.add(bsd1); 
    listBrowsers.add(bsd2); 
    listBrowsers.add(bsd3); 

    Collections.sort(listBrowsers); 

    for (int i = 0 ; i < listBrowsers.size() ; i++){ 
     BrowserStoredData bsd = listBrowsers.get(i); 
     System.out.println(bsd.toString()); 
    } 

выходу будет быть:

Default Browser  Amazon  www.Amazon.com  11/11/2014 
Default Browser  BBC   www.BBC.com   13/12/2015 
Default Browser  Google  www.Google.com  14/12/201