我有这样的方法:
public void show(Object o)
{
//show content of object
}
我想传递给它树集或哈希图。但这是一个不同的迭代,我的意思是,当我想显示 TreeSet 的内容时,我使用该代码:
while ( iter.hasNext() )
{
System.out.println( iter.next());
}
但是当我有一个HasMap时,我会像这样打印它:
Iterator iterator = map.keySet().iterator();
while (iterator.hasNext()) {
String key = iterator.next().toString();
String value = map.get(key).toString();
System.out.println(key + " " + value);
}
有没有办法显示集合的内容,当我不知道,如果用户传递了TreeSet或HashMap?我无法在显示方法中进行任何转换(这不是重点)。有什么想法吗?
不是直接的,而是如果你的方法声明为:
public <T> void show(Iterable<T> iterable) {
for(T t: iterable) {
System.out.println(t);
}
}
然后你可以像这样使用它:
show(set);
show(map.entrySet());
不完全是你想要的,但Map
和Set
本质上是不同的,你不能真正以同样的方式对待它们(多态)。
if (o instanceof Map) {
HashMap map = (HashMap) o;
Iterator iterator = map.keySet().iterator();
while (iterator.hasNext()) {
String key = iterator.next().toString();
String value = map.get(key).toString();
System.out.println(key + " " + value);
}
} else if (o instanceof Set) {
TreeSet tree = (TreeSet) o;
Iterator iter = tree.iterator();
while (iter.hasNext()) {
System.out.println(iter.next());
}
}
答案是肯定的,但有点难看:
public static void display(Object o) {
if (o instanceof Iterable) { // includes Sets, Lists etc
for (Object element : (Iterable<?>) o) {
System.out.println(element);
}
} else if (o instanceof Map) {
for (Map.Entry<Object, Object> entry : ((Map<Object,Object>) o).entrySet()) {
System.out.println(entry.getKey() + " " + entry.getValue());
}
} else if (o != null && o.getClass().isArray()){
// How to detect and handle arrays
for (Object element : (Object[])o) {
System.out.println(o);
}
} else {
// default case
System.out.println(o);
}
}
遵循更紧密的面向对象方法,您可以为类 TreeSet 和 HashMap 创建装饰器。然后,而不是调用show(object),你将调用object.show(),恕我直言,它更干净,遵循OOP原则,如封装和抽象:
public interface Showable {
void show();
}
public class ShowableTreeSet<E> extends TreeSet<E> implements Showable
{
private TreeSet<E> delegate;
public ShowableTreeSet(TreeSet<E> delegate) {
this.delegate = delegate;
}
public void show() {
for (E e : delegate) {
System.out.println(e);
}
}
public boolean add(E e) {
return delegate.add(e);
}
//all other delegate methods
}
public class ShowableHashMap<K, V> extends HashMap<K, V> implements Showable
{
private HashMap<K, V> delegate;
public ShowableHashMap(HashMap<K, V> delegate) {
this.delegate = delegate;
}
public void show(){
Iterator<K> iterator = delegate.keySet().iterator();
while (iterator.hasNext()) {
String key = iterator.next().toString();
String value = delegate.get(key).toString();
System.out.println(key + " " + value);
}
}
public int size() {
return delegate.size();
}
//all other delegate methods
}
因此,您只需将可显示对象包裹在要使用的任何实际对象周围:
ShowableTreeSet<String> sts = new ShowableTreeSet<String>(new TreeSet<String>());
sts.show();
或者,如果您只想打印任何可显示的内容,则可以:
Showable showable = new ShowableTreeSet<String>(new TreeSet<String>());
showable.show();
你可以为任何东西创建这些装饰器 - 可迭代,列表,集合等......然后使用依赖注入来使用你碰巧使用的任何集合实现(可迭代,列表...)。