2014-02-25 129 views
5

我不得不編寫一個程序來做LZWDecode,我決定使用LinkedList來編寫下面的LZWDecode程序,但我想將它轉換爲ArrayList。任何人都知道如何將LinkedList轉換爲ArrayList以使其更簡單。 謝謝。將鏈接列表轉換爲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

「轉換」是什麼意思?在代碼中更改它或對其執行「投射」操作? – Tobias

+0

看起來你會從使用'enum'而不是'int'獲益,那麼你可以在枚舉中添加行爲並丟棄你的switch語句。你也不需要範圍檢查等。參見[Enum vs Int](http://stackoverflow.com/questions/9254637/java-enum-vs-int/9254703#9254703) – Bohemian

回答

4

問題不夠清楚。 你想使用ArrayList而不是鏈接列表嗎? 或者你想將鏈接列表轉換爲ArrayList?

首先請他們沒有實現的接口上聲明變量,

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

而是使用

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

請提供你真正尋找一些更細節...

如果你想要一個數組List另外一個集合,爲此,

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

問候 Lyju

+1

爲什麼我要聲明一個LinkedList與賦值運算符(=)的左側是接口List?這本質上限制了我想要從LinkedList獲得的功能。如果我使用ArrayList完成這項工作,我將失去trimToSize等功能。這似乎是一種毫無意義的功能蹣跚。 – 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); 

所以你可以很容易地轉換LinkedList的使用其構造與傳遞集合中它ArrayList的BU。

希望它能清除你的疑惑。