3

これらのメソッドをまとめて、ネストされたマップを反復処理できるようにしました (別の SO の質問について)。

明確にわかるように、最初の 2 つのメソッドは、ジェネリックと、1 つの呼び出しiVと他の呼び出しを除いて、実際にはほとんど同じiiVです。それらを1つの方法に折りたたむ方法、または少なくともメカニズムの明確な複製を1つの場所に移動する方法はありますか?

正しく行われれば、任意の深さのネストされたマップを反復処理できるはずです。

// Iterating across Maps of Maps of Maps.
static <K1, K2, K3, V> Iterator<Iterator<Iterator<V>>> iiiV(Map<K1, Map<K2, Map<K3, V>>> mmm) {
  final Iterator<Map<K2, Map<K3, V>>> mmi = iV(mmm);
  return new Iterator<Iterator<Iterator<V>>>() {
    @Override
    public boolean hasNext() {
      return mmi.hasNext();
    }

    @Override
    public Iterator<Iterator<V>> next() {
      return iiV(mmi.next());
    }

    @Override
    public void remove() {
      mmi.remove();
    }
  };
}

// Iterating across Maps of Maps.
static <K1, K2, V> Iterator<Iterator<V>> iiV(Map<K1, Map<K2, V>> mm) {
  final Iterator<Map<K2, V>> mi = iV(mm);
  return new Iterator<Iterator<V>>() {
    @Override
    public boolean hasNext() {
      return mi.hasNext();
    }

    @Override
    public Iterator<V> next() {
      return iV(mi.next());
    }

    @Override
    public void remove() {
      mi.remove();
    }
  };
}

// Iterating across Map values.
static <K, V> Iterator<V> iV(final Map<K, V> map) {
  return iV(map.entrySet().iterator());
}

// Iterating across Map.Entries.
static <K, V> Iterator<V> iV(final Iterator<Map.Entry<K, V>> mei) {
  return new Iterator<V>() {
    @Override
    public boolean hasNext() {
      return mei.hasNext();
    }

    @Override
    public V next() {
      return mei.next().getValue();
    }

    @Override
    public void remove() {
      mei.remove();
    }
  };
}
4

1 に答える 1

0

なぜだめですか:

static <K, V> Iterator<V> iV(final Iterator<V> mei) {
   return new Iterator<V>() {
     @Override
     public boolean hasNext() {
       return mei.hasNext();
     }

     @Override
     public V next() {
       if (Iterator.class.isAssignableFrom(V.class)) {
         Iterator it = iV((Iterator)V);
         return it.hasNext() ? it.next() : ((Iterator)mei.next()).next();
       }
       else
         return mei.next().getValue();
     }

     @Override
     public void remove() {
       mei.remove();
    }
  };
}

(未検証)

于 2013-03-26T14:43:35.730 に答える