2017-12-06 6 views
0

私の目的は、動的に値をリンクリストに挿入することです。その後、ソートや検索アルゴリズムをリスト上で実行したい。
さらに、Reflectionを使用して実行時に(ユーザー入力に基づいて)クラスを作成しています。
その後、私はJSON Arrayでユーザーから提供されたデータを使用してクラスのインスタンスを作成し、インスタンスをGenericListに挿入します。
次はGeneric Linked Listのコードです。ユーザからの動的フィールドに基づいてリンクリストをソート

public class LinkedListNode<T> implements Serializable { 
    private T value; 
    private LinkedListNode<T> next; 

    public LinkedListNode(T value) { 
     this.value = value; 
    } 
    public void setNext(LinkedListNode<T> next) { 
     this.next = next; 
    } 
    public LinkedListNode<T> getNext() { 
     return next; 
    } 
    public T getValue() { 
     return value; 
    } 
} 

public class GenericList<T> implements Serializable { 
    private LinkedListNode<T> first = null; 
    public void insert(LinkedListNode<T> node) { 
     node.setNext(first); 
     first = node; 
    } 
    public void emptyList(){ 
     first = null; 
    } 
    public void remove(){ 
     if(first.getNext()!=null) 
      first = first.getNext(); 
     else first = null; 
    } 
} 

これは私がクラスのインスタンスを作成してGenericListに挿入する方法です。

//dataToInsert => is the JSONArray. => [{field1:"value1",field2:"value1"},{field1:"value2",field2:"value2"},{field1:"value3",field2:"value3"}] 
//classLoaded => package com.LinkedAnalyzerAdapter.saveTestClasses; public class order implements java.io.Serializable {public String field1;public String field2;} 
Class<?> classLoaded = classLoader.loadClass("com.LinkedAnalyzerAdapter.saveTestClasses.order"); 
GenericList<Object> list = new GenericList<Object>(); 
for (int i = 0; i < dataToInsert.length(); i++) { 
    JSONObject jsonObj = new JSONObject(); 
    jsonObj = dataToInsert.getJSONObject(i); 
    Object obj = classLoaded.newInstance(); 
    Field[] fs = classLoaded.getDeclaredFields(); 
    for (Field field : fs) 
    { 
     field.setAccessible(true); 
     Object fieldValue = jsonObj.get(field.getName()); 
     field.set(obj, fieldValue);   
    } 
    list.insert(new LinkedListNode<Object>(obj));   
} 

私は正常GenericListにしてデータを挿入することですが、挿入した後、私は後で昇順で、field1に基づいてデータをソートします。
私はそれを解決するのに数時間を費やしましたが、ソートを成功させることができませんでした。

答えて

0

に建てられたの利点を取る代わりに、独自のGenericListのjava.util.LinkedListを、使用する必要があります。

public void sortLinkedList(final String fieldToCompare){ 

     Collections.sort(testList, new Comparator<LinkedListNode>() { 
      @Override 
      public int compare(LinkedListNode arg0, LinkedListNode arg1) { 
       // TODO Auto-generated method stub 
       Field[] fs = classtoLoad.getDeclaredFields(); 
       for (Field field : fs){ 
        field.setAccessible(true); 
        Object fieldName = field.getName(); 
        if(fieldToCompare.equalsIgnoreCase((String) fieldName)){ 
         try { 
          String value1 = (String) field.get(arg0.getValue()); 
          String value2 = (String) field.get(arg1.getValue()); 
          return value1.compareToIgnoreCase(value2);  

         } catch (Exception e) { 
          // TODO Auto-generated catch block 
          e.printStackTrace(); 
         }  
         return 0; 
        } 
       } 
       return 0; 
      } 
     }); 
} 
1

あなたは本当に問題を解決するには、次のコードを使用しCollections

LinkedList<LinkedListNode<?>> list = new LinkedList<>(); 
Collections.sort(list, new Comparator<String>() { 
    @Override 
    public int compare(String o1, String o2) { 
     return ... 
    } 
} 
関連する問題