2014-02-25 23 views
5

Ich musste ein Programm schreiben, um LZWDecode zu tun, und ich entschied mich, LinkedList zu verwenden, um das LZWDecode Programm unten zu schreiben, aber ich möchte es in eine ArrayList umwandeln. Jeder hat eine Idee, wie ich die LinkedList in eine ArrayList umwandeln kann, um es einfacher zu machen. Danke.Convert Linkedlist zu ArrayList

import java.util.*; 

public class LZWDecoder { 

private final int CLEAR_TABLE=256; 
private final int END_OF_DATA=257; 
private final int TABLE_SIZE=4096; 

private static LinkedList<Integer> input = new LinkedList<Integer>(); 
@SuppressWarnings("unchecked") 
private LinkedList<Integer>[] table 
     = new LinkedList[TABLE_SIZE]; 
private LinkedList<Integer> temp = new LinkedList<Integer>(); 
private int index = 258; 
private LinkedList<String> trace = new LinkedList<String>(); 
private boolean view = true; 

private void enterData() { 
Scanner scan = new Scanner(System.in); 
System.out.println("Please enter the Input Code (EOD = 257):"); 
int n=0; 
while(n!=END_OF_DATA && scan.hasNextInt()){ 
n = scan.nextInt(); 
//System.out.println("Adding "+n); 
input.add(n); 
} 

System.out.println("Decoding...\nOutput:"); 
String code=""; 
for(int i=0; i<input.size(); i++) { 
code+=input.get(i)+" "; 
} 
trace.add("\nInput: "+code); 
//test 
/* 
while(!input.isEmpty()) { 
System.out.println(input.remove()); 
} 
*/ 
} 

private void reset() { 
trace.add("Clearing..."); 
//table.clear(); 
for(int i=0; i<TABLE_SIZE;i++) { 
table[i] = new LinkedList<Integer>(); 
} 
} 

private void decode(int c) { 
switch(c) { 
case CLEAR_TABLE: 
trace.add("decode\t"+CLEAR_TABLE+"->[256]"); 
reset(); 
break; 
case END_OF_DATA: 
trace.add("decode\t"+END_OF_DATA+"->[257]"); 
trace.add("Decoding finished."); 
break; 
default: 
if(c<256) { 
trace.add("decode\t"+c+"->["+c+"]"); 
if(!temp.isEmpty()) append(c); 
emit(c); 
add(temp); 
} else { 
trace.add("decode\t"+c+"->["+printTableNode(table[c])+"]"); 
if(!temp.isEmpty()) append(table[c].get(0)); 
emit(c, table[c]); 
add(temp); 
} 
} 
} 

private void emit(int n, LinkedList<Integer> c) { 
//int [] a=new int[c.size()]; 
temp=new LinkedList<Integer>(); 
for(int i=0; i<c.size(); i++) { 
//a[i]=c.get(i); 
System.out.print(c.get(i)+" "); 
temp.add(c.get(i)); 
} 
trace.add("emit\t"+n+"->"+"["+printTableNode(c)+"]"); 

} 

private void emit(int c) { 
//print out output 
temp=new LinkedList<Integer>(); 
temp.add(c); 
trace.add("emit\t"+c+"->"+"["+c+"]"); 
System.out.print(c+" "); 
} 

/* 
private void add(int c) { 
//added to table is copied to temp 
table[index].add(c); 
temp = (LinkedList)table[index].clone(); 
trace.add("add\t"+index+"->["+printTableNode(table[index])+"]"); 
} 
*/ 

private void add(LinkedList<Integer> c) { 
for(int i=0; i<c.size();i++) { 
//temp.add(c.get(i)); 
table[index].add(c.get(i)); 
} 
trace.add("add\t"+index+"->["+printTableNode(table[index])+"]"); 
} 


private void append(int c) { 
//table[c].add(12);//add what? 
//temp.add(c); 
table[index].add(c); 
trace.add("append\t"+index+"->["+printTableNode(table[index])+"]"); 
index++; 
} 

private String printTableNode(LinkedList l) { 
String list=""; 
for(int i=0; i<l.size();i++) { 
list+=l.get(i); 
if(i<l.size()-1) { 
list+=", "; 
} 
} 
    return list; 
} 

private void printTrace() { 
System.out.print("Printing Trace..."); 
for(int i=0; i<trace.size(); i++) { 
System.out.println(trace.get(i)); 
} 
} 

public static void main(String[] args) { 
// TODO code application logic here 
LZWDecoder d = new LZWDecoder(); 
d.enterData(); 
while(!input.isEmpty()) { 
d.decode(input.remove()); 
} 
System.out.print("\n\n"); 
d.printTrace(); 
} 

} 
+1

Was meinst du mit "konvertieren"? Ändern Sie es innerhalb des Codes oder machen Sie einen "Cast" darauf? – Tobias

+0

Sieht so aus, als würden Sie eine 'enum' anstelle von' int' verwenden, dann könnten Sie der enum ein Verhalten hinzufügen und Ihre switch-Anweisungen wegwerfen. Sie brauchen auch keine Bereichsüberprüfung usw. Siehe [Enum vs. Int] (http://StackOverflow.com/questions/9254637/java-enum-vs-int/9254703#9254703) – Bohemian

Antwort

4

Die Frage ist nicht klar genug. Möchten Sie ArrayList anstelle von Linked List verwenden? Oder möchten Sie eine verknüpfte Liste in eine ArrayList konvertieren?

allererst bitte Variablen auf ihre Schnittstelle erklären nicht auf Implementierung,

dh

LinkedList<Integer>[] table = new LinkedList[TABLE_SIZE]; 

Stattdessen verwenden

List<Integer>[] table = new LinkedList[TABLE_SIZE]; 

Bitte geben Sie ein wenig mehr Details auf, was Sie wirklich suchen ....

Wenn Sie ein Array Liste von wollen eine weitere Sammlung, dies zu tun,

List<T> t = new ArrayList<>(); 
    t.addAll(linkedList); 

Grüße Lyju

+1

Warum würde ich eine a erklären wollen LinkedList mit der linken Hand des Zuweisungsoperators (=) als Interface List? Das begrenzt inhärent die Funktionalität, die ich von der LinkedList haben möchte. Wenn ich das mit einer ArrayList machen würde, würde ich solche Funktionen wie trimToSize usw. verlieren. Das scheint wie ein sinnloses Herumhüpfen von Funktionalität. – Ungeheuer

7
LinkedList<String> ll= new LinkedList<String>(); 
ll.add("A"); 
ll.add("B"); 
ll.add("C"); 
ll.add("D"); 

List<String> myAL = new ArrayList<String>(ll); 

for (Object alObject : myAL) 
    System.out.println(alObject); 

So wie Sie bequem die LinkedList umwandeln kann bu indem man den Konstruktor mit geben Sammlung darin Arraylist.

Hoffe, es wird Ihre Zweifel beseitigen.