Java Tutorial/Collections/Abstract Set

Материал из Java эксперт
Перейти к: навигация, поиск

AbstractSet Class

import java.io.Serializable;
import java.util.AbstractSet;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import java.util.Set;
class ArraySet extends AbstractSet implements Cloneable, Serializable {
  private ArrayList list;
  public ArraySet() {
    list = new ArrayList();
  }
  public ArraySet(Collection col) {
    list = new ArrayList();
    Iterator itor = col.iterator();
    if (col instanceof Set) {
      while (itor.hasNext()) {
        list.add(itor.next());
      }
    } else {
      while (itor.hasNext()) {
        add(itor.next());
      }
    }
  }
  public Iterator iterator() {
    return list.iterator();
  }
  public int size() {
    return list.size();
  }
  public boolean add(Object element) {
    boolean modified;
    if (modified = !list.contains(element)) {
      list.add(element);
    }
    return modified;
  }
  public boolean remove(Object element) {
    return list.remove(element);
  }
  public boolean isEmpty() {
    return list.isEmpty();
  }
  public boolean contains(Object element) {
    return list.contains(element);
  }
  public void clear() {
    list.clear();
  }
  public Object clone() {
    try {
      ArraySet newSet = (ArraySet) super.clone();
      newSet.list = (ArrayList) list.clone();
      return newSet;
    } catch (CloneNotSupportedException e) {
      throw new InternalError();
    }
  }
}
public class MainClass {
  public static void main(String args[]) {
    String elements[] = { "A", "B", "C", "D", "E" };
    Set set = new ArraySet(Arrays.asList(elements));
    Iterator iter = set.iterator();
    while (iter.hasNext()) {
      System.out.println(iter.next());
    }
  }
}



A
B
C
D
E


One Item Set

/* $Id$
 *
 * Behavior Protocols Tools - Parsers, Transformations
 * Copyright (C) 2006-2007  DSRG, Charles University in Prague
 *                          http://dsrg.mff.cuni.cz/
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
 * MA 02110-1301 USA
 *
 */

import java.io.Serializable;
import java.util.AbstractCollection;
import java.util.Iterator;
import java.util.NoSuchElementException;

/**
 *
 * @author thorm
 */
public class OneItemSet<E> extends AbstractCollection<E> implements Serializable{
    
    public boolean add(E i) {
        if (item == i) {
            return false;
        }
        if (item == null) {
            item = i;
            return true;
        }
        throw new IllegalArgumentException();
    }
    
    public Iterator<E> iterator() {
        return new Iterator() {
            public boolean hasNext() {
                return hasNxt;
            }
            
            public E next() {
                if (hasNxt) {
                    hasNxt = false;
                    return item;
                }
                throw new NoSuchElementException();
            }
            
            public void remove() {
                item = null;
            }
            boolean hasNxt = true;
        };
    }
    
    public int size() {
        return (item == null) ? 0 : 1;
    }
    public int hashCode() {
        return item.hashCode();
    }
    public boolean equals(Object o) {
        return (o instanceof OneItemSet) && item.equals(((OneItemSet) o).item);
    }
            
    E item;
}





Things you can do with Sets

import java.util.Arrays;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Set;
import java.util.TreeSet;
public class MainClass {
  static void fill(Set s) {
    s.addAll(Arrays.asList("one two three four five six seven".split(" ")));
  }
  public static void test(Set s) {
    System.out.println(s.getClass().getName().replaceAll("\\w+\\.", ""));
    fill(s);
    fill(s);
    fill(s);
    System.out.println(s); // No duplicates!
    s.addAll(s);
    s.add("one");
    s.add("one");
    s.add("one");
    System.out.println(s);
    System.out.println("s.contains(\"one\"): " + s.contains("one"));
  }
  public static void main(String[] args) {
    test(new HashSet());
    test(new TreeSet());
    test(new LinkedHashSet());
  }
}



HashSet
[one, two, five, four, three, seven, six]
[one, two, five, four, three, seven, six]
s.contains("one"): true
TreeSet
[five, four, one, seven, six, three, two]
[five, four, one, seven, six, three, two]
s.contains("one"): true
LinkedHashSet
[one, two, three, four, five, six, seven]
[one, two, three, four, five, six, seven]
s.contains("one"): true