2017-12-06 2 views
0

Mein Ziel ist es, Werte dynamisch in die Verknüpfte Liste einzufügen. Und danach möchte ich Sortier- oder Suchalgorithmen auf der Liste ausführen.
Zusätzlich erstellt ich Klasse zur Laufzeit (basierend auf Benutzereingabe) mit Reflection.
Danach verwende ich Daten vom Benutzer in JSON Array zur Verfügung gestellt, um Instanzen der Klasse zu erstellen, und dann füge ich die Instanzen in die GenericList.
Folgendes ist der Code für die Generic Linked List.Sortierte Verknüpfungsliste basierend auf dynamischem Feld von Benutzer

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

Und das ist, wie ich Instanzen der Klasse erstellen und an die GenericList einzufügen.

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

Ich bin erfolgreich in der Lage Daten in zu GenericList einzufügen, aber nach dem Einsetzen mag ich später die Daten über field1, in aufsteigender Reihenfolge sortieren.
Ich habe Stunden damit verbracht, es zu lösen, aber nicht erfolgreich Sortierung zu erreichen.

Antwort

0

den folgenden Code verwendet, um das Problem zu beheben.

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

Sie sollten wirklich nutzen java.util.LinkedList statt Ihrer eigenen GenericList, unter Ausnutzung der eingebauten zu nehmen in Collections

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