2016-05-25 20 views
0

それは非常に難しいので、一度コンパレータでソートされたリストを再びソートすることはできませんでしたが、これは配列の値をソートする//
蛇腹ALLべき常にTOPJava |配列内の値の変化を伴う配列値に基づくソートリストの繰り返し配列

  1. //上の1 SortTechのmainList ALLをソートする//その後取られた場合、B、A、C、D、E、F、G
  2. // 1が今撮影されたときに4が取られる //ソートされるSortTechのメインリストALL、B、E、A、C、D、F、G
  3. //今は1,4 6,5を取得// sortTechのmainListをソートするALL、G、F、A、B、C、D、E
  4. // 6,5が取得され、-1が取り込まれた後、// SortTechのmainListあなたのコンパレータの別のクラスを作成し、A、B、C、D、E、F、G
package com.test; 

import java.util.ArrayList; 
import java.util.List; 

public class SortTech { 

    private long id; 
    private String name ; 


    public static void main(String[] args) { 

     List<SortTech> mainList = new ArrayList<>(); 

     SortTech S1 = new SortTech(); 
     S1.setName("ALL"); 
     S1.setId(-1); 
     mainList.add(S1); 

     SortTech S2 = new SortTech(); 
     S2.setName("A"); 
     S2.setId(0); 
     mainList.add(S2); 


     SortTech S3 = new SortTech(); 
     S3.setName("B"); 
     S3.setId(1); 
     mainList.add(S3); 

     SortTech S4 = new SortTech(); 
     S4.setName("C"); 
     S4.setId(2); 
     mainList.add(S4); 

     SortTech S5 = new SortTech(); 
     S5.setName("D"); 
     S5.setId(3); 
     mainList.add(S5); 

     SortTech S6 = new SortTech(); 
     S6.setName("E"); 
     S6.setId(4); 
     mainList.add(S6); 

     SortTech S7 = new SortTech(); 
     S7.setName("F"); 
     S7.setId(5); 
     mainList.add(S7); 

     SortTech S8 = new SortTech(); 
     S8.setName("G"); 
     S8.setId(6); 
     mainList.add(S8); 


/*  //tried with comparator but it give unmodifiable list in return so could not modify any further 
* Collections.sort(mainList, new Comparator<SortTech>() { 
      public int compare(SortTech t1, SortTech t2) { 
       if (t1.getName().equals("ALL")) 
        return -1; 
       if (t2.getName().equals("ALL")) 
        return 1; 
       return t2.getName().compareTo(t2.getName()); 
      } 
     });*/ 


     //ALL should always on TOP 

     //if 1 is taken 
     Long[] taken = new Long[]{(long) 1}; 
     //mainList of SortTech to be sorted as ALL , B , A , C, D, E, F ,G 
     //system out 

     //1 was taken now 4 is taken 
     taken = new Long[]{(long) 1, (long) (4)}; 
     //mainList of SortTech to be sorted as ALL, B , E, A , C, D, F ,G 
     //system out 

     //now 1,4 are dropped and 6,5 taken 
     taken = new Long[]{(long) 6, (long) (5)}; 
     //mainList of SortTech to be sorted as ALL, G, F, A , B, C, D, E 
     //system out 

     //now 6,5 was taken now -1 is taken 
     taken = new Long[]{(long) 6, (long) (5), (long) (-1)}; 
     //mainList of SortTech to be sorted as ALL, A , B, C, D, E , F, G 
     //system out 








    } 



    /** 
    * @return the id 
    */ 
    public long getId() { 
     return id; 
    } 



    /** 
    * @param id the id to set 
    */ 
    public void setId(long id) { 
     this.id = id; 
    } 



    /** 
    * @return the name 
    */ 
    public String getName() { 
     return name; 
    } 



    /** 
    * @param name the name to set 
    */ 
    public void setName(String name) { 
     this.name = name; 
    } 



} 
+0

サイドノートでは、配列にアルファベットを書いたり、文字列を書くことができ、idと一致するインデックスを使って各文字にアクセスできます。 char {]アルファベット= new char [] {'A'、 'B'、 'C​​'、 'D'、 'E' ...}; ' 'for(int i = 0; i < (i); '' SortTech s = new SortTech(); ' ' S.setName(アルファベット[i]); ' ' S.setId(i); ' ' mainList.add(s) ; '}' – Underbalanced

+0

返信、A、B、C、0,1,2のための@Underbalancedありがとうございました。リンゴ、グーグル、または323,456のようなものがあります。ここでは長い配列とベース長い配列値では、オブジェクトのリストをソートする必要があります – djCode

答えて

0

まず、ALLソートすること。コンパレーターに '取られた'リストを与える方法が必要なので、これが必要です。その後

public class SortTechComparator implements Comparator<SortTech> { 

    Array<Long> taken; 

    public SortTechComparator<SortTech>(Long[] takenArray) { 
     taken = Arrays.asList(takenArray); 
    } 

    public int compare(SortTech t1, SortTech t2) { 
     // 1. if t1 is 'ALL' 
     if (t1.getName().equals("ALL")) 
      return -1; 

     // 2. if t2 is 'ALL' 
     if (t2.getName().equals("ALL")) 
      return 1; 

     // 3. if 'ALL' is not taken 
     if (!isItemTaken(-1)) { 

      // 4. if one item is in 'taken' list but the other is not 
      if (isItemTaken(t1.getId()) != isItemTaken(t2.getId())) { 
       return isItemTaken(t1.getId()) ? -1 : 1; 
      } 

      // 5. if both items are 'taken' 
      if (isItemTaken(t1.getId()) && isItemTaken(t2.getId())) { 
       return itemPosition(t1.getId()) < itemPosition(t2.getId()) ? -1 : 1; 
      } 
     } 

     // 6. sort based on name 
     return t2.getName().compareTo(t2.getName()); 
    } 

    private boolean isItemTaken(long itemId) { 
     return taken.contains(itemId); 
    } 

    private long itemPosition(long itemId) { 
     return taken.indexOf(itemId); 
    } 
} 

あなたはソートするコンパレータを使用したい:

それは

  1. 仕組み
    Long[] taken = ... 
    Collections.sort(mainList, new SortTechComparator(taken)); 
    

    それがT1である場合、これは最初の 'ALL' を置きます。

  2. これは、t2にある場合は、最初に 'ALL'を挿入します。
  3. 'ALL'を選択した場合は、他のすべてのソート順は名前に基づいている必要があります。したがって、 '取得'ベースのソートはスキップしてください。このテストを逆転して、 'ALL'がではなく、を取った場合にのみ、「取得」ベースのソートを行います。
  4. 1つのアイテムが '撮影済み'リストにあるが、もう1つのアイテムがない場合、最初のアイテムが '撮影済み'リストにあるかどうかによってソートできます。
  5. 両方の項目が撮影されている場合は、「撮影済み」リストの位置を並べ替えます。
  6. これはキャッチオールです。私たちがここに来たら、名前の並べ替えが必要です。
関連する問題