2017-05-05 19 views
0

私は4つのArrayListを持っています。私は大文字と小文字を区別してアルファベット順にソートし、他の3つのArrayListsで同じ変更を行いたいと思います。アルファベット順のJavaソートArrayListと他の配列で同じ変更を行う

ArrayList<String> arrPackage = new ArrayList<>(); 
ArrayList<String> arrPackageDates = new ArrayList<>(); 
ArrayList<String> arrPackageDuration = new ArrayList<>(); 
ArrayList<String> arrPackageFileSize = new ArrayList<>(); 
// Code to add data to ArrayLists (data is not coming from sqlite database) 
... 
// Code to sort arrPackage alphabatically with case ignored 
    Collections.sort(arrPackage, new Comparator<String>() { 
         @Override 
         public int compare(String s1, String s2) { 
          return s1.compareToIgnoreCase(s2); 
         } 
        }); 

どのように変更されたインデックスがわかりますか?

+0

まさにあなたはインデックスが変更されたかに関して知っておく必要がありますか? –

+0

他の3つのArrayListで同じ変更を行うだけで、最初のArrayListでどのインデックスが交換されたかを知る必要があると思いますか? – Ali

+2

次に、 'Package'という名前のラッパーオブジェクトを作成する必要があります。このオブジェクトには、名前、日付、継続時間、およびファイルサイズのフィールドが含まれています。パッケージをまとめて並べ替えます。さて、もしこのデータが何とかデータベースから来たのであれば、おそらくそこでソートを行うべきです。 –

答えて

2

1つの方法は、現在の4つのリストに表示される4つのタイプのメタデータを含むラッパーオブジェクトPackageを作成することです。このような何か:

public class Package { 
    private String name; 
    private String date; 
    private String duration; 
    private String fileSize; 

    public Package() { 
     // can include other constructors as well 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    // other getters and setters 
} 

次にソートPackageオブジェクト上で動作するカスタムコンパレータを使用して:一般的な免責条項として

List<Package> packages = new ArrayList<>(); 

Collections.sort(packages, new Comparator<Package>() { 
    @Override 
    public int compare(Package p1, Package p2) { 
     String name1 = p1.getName(); 
     String name2 = p2.getName(); 

     return name1.compareToIgnoreCase(name2); 
    } 
}); 

は、上記の操作は、ほとんどの場合、データベースにする必要があり、より効率的に実行されるであろう。したがって、データが最終的にデータベースから取得される場合は、そのような重い作業をやろうとする必要があります。

+0

それはクリーンなコードで良い説明です。 –

0

簡単な方法で簡単にArrayListをバックアップできます。

ArrayList<String> backupPackage = arrPackage; 

次に、コードを使用して配列を並べ替えます。次に、forループを使用して2つの配列を比較します。

for (int i = 0; i < backupArray.size(); i++) { 
    if (!aar.get(i).equals(aar.get(i))) { // then the item has been changed 
     // ... YOUR CODE 

     // at this point you know which indexes have been changed and can modify your other arrays in any way you need 
    } 
} 
0

私はこのアプローチを使用:

    ArrayList<String> backupPackage = new ArrayList<>(); 
        ArrayList<String> backupPackageDates = new ArrayList<>(); 
        ArrayList<String> backupPackageDuration = new ArrayList<>(); 
        ArrayList<String> backupPackageFileSize = new ArrayList<>(); 
        for(int j=0;j<arrPackage.size();j++) { 
         backupPackage.add(arrPackage.get(j)); 
        } 
        for(int j=0;j<arrPackageDates.size();j++) { 
         backupPackageDates.add(arrPackageDates.get(j)); 
        } 
        for(int j=0;j<arrPackageDuration.size();j++) { 
         backupPackageDuration.add(arrPackageDuration.get(j)); 
        } 
        for(int j=0;j<arrPackageFileSize.size();j++) { 
         backupPackageFileSize.add(arrPackageFileSize.get(j)); 
        } 
        Collections.sort(arrPackage, new Comparator<String>() { 
         @Override 
         public int compare(String s1, String s2) { 
          return s1.compareToIgnoreCase(s2); 
         } 

        }); 
        int newindex; 
        for(int i=0; i<backupPackage.size(); i++) { 
         newindex = backupPackage.indexOf(arrPackage.get(i)); 
         if(newindex != i) { 
          arrPackageDates.set(i, backupPackageDates.get(newindex)); 
          arrPackageDuration.set(i, backupPackageDuration.get(newindex)); 
          arrPackageFileSize.set(i, backupPackageFileSize.get(newindex)); 
         } 
        } 
        backupPackage.clear();      
        backupPackageDuration.clear();  
        backupPackageDuration.clear(); 
        backupPackageFileSize.clear(); 
関連する問題