【问题标题】:Sort Linked List based on dynamic field from user根据用户的动态字段对链表进行排序
【发布时间】:2017-12-06 15:20:23
【问题描述】:

我的目标是将值动态插入到链接列表中。此后,我想对 List 执行排序或搜索算法。
除此之外,我正在使用反射在运行时(基于用户输入)创建类。
此后,我使用用户在 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对数据进行升序排序。
我花了几个小时解决它,但无法成功完成排序。

【问题讨论】:

    标签: java generics data-structures linked-list


    【解决方案1】:

    你真的应该使用 java.util.LinkedList 而不是你自己的 GenericList,以利用内置的 Collections

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

    【讨论】:

      【解决方案2】:

      使用以下代码解决问题。

      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;
                  }
              }); 
      }
      

      【讨论】:

        猜你喜欢
        • 2016-07-03
        • 1970-01-01
        • 2021-05-16
        • 1970-01-01
        • 1970-01-01
        • 2019-07-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多