Mercurial Hosting > luan
comparison src/luan/LuaTable.java @ 47:659c7139e903
better conversion
git-svn-id: https://luan-java.googlecode.com/svn/trunk@48 21e917c8-12df-6dd8-5cb6-c86387c605b9
author | fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9> |
---|---|
date | Thu, 27 Dec 2012 04:36:44 +0000 |
parents | a443637829c1 |
children |
comparison
equal
deleted
inserted
replaced
46:a443637829c1 | 47:659c7139e903 |
---|---|
6 import java.util.HashMap; | 6 import java.util.HashMap; |
7 import java.util.List; | 7 import java.util.List; |
8 import java.util.ArrayList; | 8 import java.util.ArrayList; |
9 import java.util.Collections; | 9 import java.util.Collections; |
10 import java.util.Comparator; | 10 import java.util.Comparator; |
11 import java.util.Set; | |
12 import java.util.HashSet; | |
11 | 13 |
12 | 14 |
13 public class LuaTable { | 15 public class LuaTable { |
14 private Map<Object,Object> map = null; | 16 private Map<Object,Object> map = null; |
15 private List<Object> list = null; | 17 private List<Object> list = null; |
19 | 21 |
20 public LuaTable(List<Object> list) { | 22 public LuaTable(List<Object> list) { |
21 this.list = list; | 23 this.list = list; |
22 } | 24 } |
23 | 25 |
26 public LuaTable(Map<Object,Object> map) { | |
27 this.map = map; | |
28 } | |
29 | |
30 public LuaTable(Set<Object> set) { | |
31 map = new HashMap<Object,Object>(); | |
32 for( Object obj : set ) { | |
33 map.put(obj,Boolean.TRUE); | |
34 } | |
35 } | |
36 | |
37 boolean isList() { | |
38 return map==null || map.isEmpty(); | |
39 } | |
40 | |
41 List<Object> asList() { | |
42 return list!=null ? list : Collections.emptyList(); | |
43 } | |
44 | |
45 Map<Object,Object> asMap() { | |
46 if( list == null || list.isEmpty() ) | |
47 return map!=null ? map : Collections.emptyMap(); | |
48 Map<Object,Object> rtn = map!=null ? new HashMap<Object,Object>(map) : new HashMap<Object,Object>(); | |
49 for( ListIterator iter = list.listIterator(); iter.hasNext(); ) { | |
50 int i = iter.nextIndex(); | |
51 rtn.put(i+1,iter.next()); | |
52 } | |
53 return rtn; | |
54 } | |
55 | |
56 boolean isSet() { | |
57 if( list != null ) { | |
58 for( Object obj : list ) { | |
59 if( obj!=null && !obj.equals(Boolean.TRUE) ) | |
60 return false; | |
61 } | |
62 } | |
63 if( map != null ) { | |
64 for( Object obj : map.values() ) { | |
65 if( !obj.equals(Boolean.TRUE) ) | |
66 return false; | |
67 } | |
68 } | |
69 return true; | |
70 } | |
71 | |
72 Set<Object> asSet() { | |
73 if( list == null || list.isEmpty() ) | |
74 return map!=null ? map.keySet() : Collections.emptySet(); | |
75 Set<Object> rtn = map!=null ? new HashSet<Object>(map.keySet()) : new HashSet<Object>(); | |
76 for( int i=1; i<=list.size(); i++ ) { | |
77 rtn.add(i); | |
78 } | |
79 return rtn; | |
80 } | |
81 | |
24 @Override public String toString() { | 82 @Override public String toString() { |
25 return "table: " + Integer.toHexString(hashCode()); | 83 // return "table: " + Integer.toHexString(hashCode()); |
84 StringBuilder sb = new StringBuilder(); | |
85 sb.append('{'); | |
86 boolean isFirst = true; | |
87 if( list != null ) { | |
88 boolean gotNull = false; | |
89 for( int i=0; i<list.size(); i++ ) { | |
90 Object obj = list.get(i); | |
91 if( obj==null ) { | |
92 gotNull = true; | |
93 } else { | |
94 if( isFirst ) { | |
95 isFirst = false; | |
96 } else { | |
97 sb.append(", "); | |
98 } | |
99 if( gotNull ) | |
100 sb.append(i+1).append('='); | |
101 sb.append(obj); | |
102 } | |
103 } | |
104 } | |
105 if( map != null ) { | |
106 for( Map.Entry<Object,Object> entry : map.entrySet() ) { | |
107 if( isFirst ) { | |
108 isFirst = false; | |
109 } else { | |
110 sb.append(", "); | |
111 } | |
112 sb.append(entry.getKey()).append('=').append(entry.getValue()); | |
113 } | |
114 } | |
115 sb.append('}'); | |
116 return sb.toString(); | |
26 } | 117 } |
27 | 118 |
28 public Object get(Object key) { | 119 public Object get(Object key) { |
29 if( list != null ) { | 120 if( list != null ) { |
30 Integer iT = Lua.asInteger(key); | 121 Integer iT = Lua.asInteger(key); |
41 | 132 |
42 public Object put(Object key,Object val) { | 133 public Object put(Object key,Object val) { |
43 Integer iT = Lua.asInteger(key); | 134 Integer iT = Lua.asInteger(key); |
44 if( iT != null ) { | 135 if( iT != null ) { |
45 int i = iT - 1; | 136 int i = iT - 1; |
46 if( list == null && i == 0 ) | 137 if( list != null || i == 0 ) { |
47 list = new ArrayList<Object>(); | 138 if( i == list().size() ) { |
48 if( list != null ) { | |
49 if( i == list.size() ) { | |
50 if( val != null ) { | 139 if( val != null ) { |
51 list.add(val); | 140 list.add(val); |
52 if( map != null ) { | 141 mapToList(); |
53 while(true) { | |
54 Object v = map.remove(Double.valueOf(list.size()+1)); | |
55 if( v == null ) | |
56 break; | |
57 list.add(v); | |
58 } | |
59 } | |
60 } | 142 } |
61 return null; | 143 return null; |
62 } else if( i>=0 && i<list.size() ) { | 144 } else if( i>=0 && i<list.size() ) { |
63 Object old = list.get(i); | 145 Object old = list.get(i); |
64 list.set(i,val); | 146 list.set(i,val); |
83 } else { | 165 } else { |
84 return map.put(key,val); | 166 return map.put(key,val); |
85 } | 167 } |
86 } | 168 } |
87 | 169 |
170 private void mapToList() { | |
171 if( map != null ) { | |
172 while(true) { | |
173 Object v = map.remove(Double.valueOf(list.size()+1)); | |
174 if( v == null ) | |
175 break; | |
176 list.add(v); | |
177 } | |
178 } | |
179 } | |
180 | |
181 private List<Object> list() { | |
182 if( list == null ) { | |
183 list = new ArrayList<Object>(); | |
184 mapToList(); | |
185 } | |
186 return list; | |
187 } | |
188 | |
88 public void insert(int pos,Object value) { | 189 public void insert(int pos,Object value) { |
89 if( list == null ) | 190 list().add(pos-1,value); |
90 list = new ArrayList<Object>(); | |
91 list.add(pos-1,value); | |
92 } | 191 } |
93 | 192 |
94 public Object remove(int pos) { | 193 public Object remove(int pos) { |
95 if( list == null ) | 194 return list().remove(pos-1); |
96 list = new ArrayList<Object>(); | |
97 return list.remove(pos-1); | |
98 } | 195 } |
99 | 196 |
100 public void sort(Comparator<Object> cmp) { | 197 public void sort(Comparator<Object> cmp) { |
101 if( list != null ) | 198 Collections.sort(list(),cmp); |
102 Collections.sort(list,cmp); | |
103 } | 199 } |
104 | 200 |
105 public int length() { | 201 public int length() { |
106 return list==null ? 0 : list.size(); | 202 return list==null ? 0 : list.size(); |
107 } | 203 } |
156 public Object[] listToArray() { | 252 public Object[] listToArray() { |
157 return list==null ? new Object[0] : list.toArray(); | 253 return list==null ? new Object[0] : list.toArray(); |
158 } | 254 } |
159 | 255 |
160 public LuaTable subList(int from,int to) { | 256 public LuaTable subList(int from,int to) { |
161 if( list == null ) | 257 return new LuaTable(new ArrayList<Object>(list().subList(from-1,to-1))); |
162 list = new ArrayList<Object>(); | |
163 return new LuaTable(new ArrayList<Object>(list.subList(from-1,to-1))); | |
164 } | 258 } |
165 | 259 |
166 public LuaTable getMetatable() { | 260 public LuaTable getMetatable() { |
167 return metatable; | 261 return metatable; |
168 } | 262 } |