2014-02-25 7 views
5

LZWDecode를 수행하는 프로그램을 작성해야하고 LinkedList를 사용하여 아래의 LZWDecode 프로그램을 작성하기로 결정했지만 ArrayList로 변환하려고합니다. 누구나 내가 LinkedList를 ArrayList로 변환하여 더 간단하게 만들 수있는 방법에 대해 알고 있습니다. 감사합니다. .LinkedList를 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

'int' 대신'enum'을 사용하면 도움이되는 것처럼 보입니다. 그러면 enum에 동작을 추가하고 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]; 

은 당신이 정말로 원하는 것에 좀 더 세부 사항을 제공하십시오 사용하지 구현에 자신의 인터페이스에 변수를 선언하십시오 ....

배열을 원한다면 당신은 쉽게에서 컬렉션을 전달하여 생성자를 사용하여 BU를 ArrayList와하는 LinkedList의 변환 할 수 있습니다와 같은 다른 컬렉션,

+1

왜 내가 선언하고 싶습니까? 할당 연산자 (=)의 왼손이 인터페이스 목록 인 LinkedList? 그것은 본질적으로 내가 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); 

그래서,

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

감사 Lyju을 이렇게.

의심의 여지가 없기를 바랍니다.

관련 문제