Go Premium for a chance to win a PS4. Enter to Win

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 362
  • Last Modified:

Efficient way to load a linked list C like datastructure

Hi guys,

I'm looking for an efficient and clean way to fill up a linked list datastructure that I use with JNI to interface with a C program. I have to use this same structure as a parameter when calling the JNI again.

The first class is the class I want to fill up and as you can see there is a pointer to the next structure p_next_rec

And below that is a snippet of how I'm currently proposing on implementing what I want to do but I was wondering if there is a better way.

(Note I haven't run this through a compiler only wrote it in notepad so not too worried about minor syntax errors if there is any).
//Class that is similar to what I'm using which is part of the JNI
public class API_DATASTRUCTURE_T implements Serializable, Cloneable 
{
  // Fields
  public static String[] _meths;
  private API_DATASTRUCTURE_T p_next_rec;
  private String name;
 
  // Constructors
  public API_DATASTRUCTURE_T() { }
 
  // Methods
  public API_DATASTRUCTURE_T getP_next_rec() { return null;}
  public String get_name() { return null;}
  private static native void initFIDs();
  public void setP_next_rec(API_DATASTRUCTURE_T aPI_DATASTRUCTURE_T) { }
  public void setname(String string) { }
}
 
 
//Snippet of code to fill up the above structure
 
		//this variable will be my final object that is full with data
        API_DATASTRUCTURE_T setupDataStructure = new API_DATASTRUCTURE_T();
        
        //Use this variable to keep a pointer reference when traversing the structure above
        API_DATASTRUCTURE_T pointerToNextStructure = new API_DATASTRUCTURE_T();
 
		//this is a collection with the names
		Iterator<String> dataIt = collectionWithData.iterator();
        
        //Fill first structure
        if(dataIt.hasNext())
        {
        	setupDataStructure.setname(dataIt.next());
		}
        
        //if we have more than one then keep a pointer reference so we can traverse the structure
        if(dataIt.hasNext())
        {
            pointerToNextStructure = setupDataStructure;
        }
        
        while(dataIt.hasNext())
        {
            //place holder for data for each iteration.
            API_DATASTRUCTURE_T placeHolder = new API_DATASTRUCTURE_T();
            
 
            //setting name
            placeHolder.setname(dataIt.next());
            
            pointerToNextStructure.setP_next_rec(placeHolder);
 
            //Traversing through the structure while keeping a reference to the pointer
            pointerToNextStructure = pointerToNextStructure.getP_next_rec(); 
        }        
 
		//WHEN I GET HERE I CAN USE setupDataStructure which is now full with data.

Open in new window

0
LiamOB
Asked:
LiamOB
  • 3
  • 3
  • 2
  • +1
3 Solutions
 
CEHJCommented:
Personally i would keep it more Java-like and you probably ought to implement some collection-oriented interfaces. You might want a ctor with the following prototype
public ApiDataStructure(Collection data)

Open in new window

0
 
LiamOBAuthor Commented:
Are you proposing I change API_DATASTRUCTURE_T class?

If you are then unfortunately I can't, this is a very large scale program and this class is auto generated as part of our JNI infrastructure. So I don't have an option of changing API_DATASTRUCTURE_T class.
0
 
CEHJCommented:
If it's auto-generated, then don't worry about names.

Otherwise, just keep a reference to the head and tail of the list and fill it with elements from your collection
0
Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
Ken ClementSoftware DeveloperCommented:
If efficiency is what you are really after and the use of JNI with C is already a committed decision then consider outsourcing the serialization/deserialization of the API_DATASTRUCTURE_T to the native side of things.  That way you could either implement the serialized list as a sequence of records in a file (formatted appropriately for C file semantics) or as a memory mapped file with the mapping to a fixed virtual address or with non-pointer mechanisms (e.g. relative offsets) used to connect things together.

While I don't have the JNI reference handy, I recall that JNI had everything necessary to expose structures on the native side as Java objects to the JVM.  You could even implement iterator semantics on a collection of these beasts.
0
 
LiamOBAuthor Commented:
CEHJ: I don't understand what you mean when you say "don't worry about names"?? are you talking where I set the name? if so this is just a variable I have to set, in reality there is more variables other than name.

KenClement: This is a large scale project and I don't have time to investigate what you said, I'm just looking for a clean way to implement this in Java in the current format that is presented to me. Thanks for the comment though.
0
 
CEHJCommented:
>>CEHJ: I don't understand what you mean when you say "don't worry about names"??

Only about naming conventions. Don't worry about them if aut-generated
0
 
objectsCommented:

you create some instances unnecessarily, and it can be simplified a little.
try this:

//this variable will be my final object that is full with data

API_DATASTRUCTURE_T setupDataStructure = null;
       
//Use this variable to keep a pointer reference when traversing the structure above

API_DATASTRUCTURE_T pointerToNextStructure = null;
 
//this is a collection with the names
Iterator dataIt = collectionWithData.iterator();
       
while(dataIt.hasNext())
{
     //place holder for data for each iteration.
     API_DATASTRUCTURE_T placeHolder = new API_DATASTRUCTURE_T();
 
     //setting name
     placeHolder.setname(dataIt.next());
     
     // check if its first
     if (setupDataStructure==null)
     {
          setupDataStructure = placeHolder;
     }
     else
     {
          pointerToNextStructure.setP_next_rec(placeHolder);
     }
     //Traversing through the structure while keeping a reference to the pointer
     pointerToNextStructure = placeHolder;
}        
 
//WHEN I GET HERE I CAN USE setupDataStructure which is now full with data.
0
 
Ken ClementSoftware DeveloperCommented:
>> This is a large scale project and I don't have time to investigate what you said, I'm just looking for a clean way to implement this in Java in the current format that is presented to me.

In that case as long as the linked list is not too large (< 100 entries or so) almost any correct method will do.  If that is the case you ought to stick to whatever you are comfortable with.
0
 
LiamOBAuthor Commented:
Thanks guys for your comments, I gave the points between anyone that helped, the most points for objects as he used a bit of code. I ended up tweaking my code a different way but not much really. Thanks again anyway.
0

Featured Post

Ask an Anonymous Question!

Don't feel intimidated by what you don't know. Ask your question anonymously. It's easy! Learn more and upgrade.

  • 3
  • 3
  • 2
  • +1
Tackle projects and never again get stuck behind a technical roadblock.
Join Now