modificato arraysequence in fake e aggiunti una nuova versione. fidato alcuni metodi che restituivano void invece di position. sono necessari ulteriori test

This commit is contained in:
2014-03-31 22:43:48 +02:00
parent 483863d410
commit eb15d53208
8 changed files with 414 additions and 76 deletions

View File

@@ -0,0 +1,25 @@
package com.xgiovio;
import general_utility.test_object;
import position.Position;
import sequence.ArraySequenceFake;
/**
* Created with xgiovio.macbookair.
* User: xgiovio
* Date: 23/03/14
* Time: 20:37
*/
public class ArraySequenceFakeTest {
public static void main(String[] args) {
ArraySequenceFake<test_object> a = new ArraySequenceFake<test_object>(10);
a.addFirst(new test_object(3));
Position<test_object> p = a.addAfter(a.first(), new test_object(6));
System.out.print(a);
}
}

View File

@@ -1,10 +1,9 @@
package com.xgiovio; package com.xgiovio;
import arraylist.ArrayIndexList;
import general_utility.test_object; import general_utility.test_object;
import position.Position; import position.Position;
import sequence.ArraySequence; import sequence.ArraySequence;
import sequence.NodeSequence; import sequence.ArraySequenceFake;
/** /**
* Created with xgiovio.macbookair. * Created with xgiovio.macbookair.
@@ -17,43 +16,9 @@ public class ArraySequenceTest {
public static void main(String[] args) { public static void main(String[] args) {
ArraySequence<test_object> a = new ArraySequence<test_object>(10); ArraySequence<test_object> a = new ArraySequence<test_object>(10);
a.add(0,new test_object(1)); a.addFirst(new test_object(3));
a.add(1,new test_object(2)); Position<test_object> p = a.addAfter(a.first(), new test_object(6));
a.add(2,new test_object(3));
a.add(3,new test_object(4));
System.out.print(a); System.out.print(a);
a.remove(2);
System.out.print(a);
System.out.print(a.first().element());
System.out.print(a.last().element());
a.addLast(new test_object(1000));
System.out.print(a);
a.addFirst(new test_object(2000));
System.out.print(a);
a.add(0,new test_object(1));
System.out.print(a);
a.add(5,new test_object(5));
System.out.print(a);
a.add(6,new test_object(125));
System.out.print(a);
a.add(8,new test_object(211));
System.out.print(a);
a.set(0, new test_object(211));
System.out.print(a);
a.set(1,new test_object(211));
System.out.print(a);
global.reverse(a);
System.out.print(a);
} }

View File

@@ -79,21 +79,22 @@ public class NodePositionList<E> implements PositionList<E> {
return next; return next;
} }
public void addBefore(Position<E> p, E element) throws InvalidPositionException { public Position<E> addBefore(Position<E> p, E element) throws InvalidPositionException {
DNode<E> v = checkPosition(p); DNode<E> v = checkPosition(p);
numElts++; numElts++;
DNode<E> newNode = new DNode<E>(v.getPrev(), v, element); DNode<E> newNode = new DNode<E>(v.getPrev(), v, element);
v.getPrev().setNext(newNode); v.getPrev().setNext(newNode);
v.setPrev(newNode); v.setPrev(newNode);
return newNode;
} }
public void addAfter(Position<E> p, E element) public Position<E> addAfter(Position<E> p, E element) throws InvalidPositionException {
throws InvalidPositionException {
DNode<E> v = checkPosition(p); DNode<E> v = checkPosition(p);
numElts++; numElts++;
DNode<E> newNode = new DNode<E>(v, v.getNext(), element); DNode<E> newNode = new DNode<E>(v, v.getNext(), element);
v.getNext().setPrev(newNode); v.getNext().setPrev(newNode);
v.setNext(newNode); v.setNext(newNode);
return newNode;
} }
public void addFirst(E element) { public void addFirst(E element) {

View File

@@ -27,9 +27,9 @@ public interface PositionList<E> {
public void addLast(E e); public void addLast(E e);
public void addAfter(Position<E> p, E e) throws InvalidPositionException; public Position<E> addAfter(Position<E> p, E e) throws InvalidPositionException;
public void addBefore(Position<E> p, E e) throws InvalidPositionException; public Position<E> addBefore(Position<E> p, E e) throws InvalidPositionException;
public E remove(Position<E> p) throws InvalidPositionException; public E remove(Position<E> p) throws InvalidPositionException;

View File

@@ -1,27 +1,82 @@
package sequence; package sequence;
import arraylist.ArrayIndexList;
import exceptions.BoundaryViolationException; import exceptions.BoundaryViolationException;
import exceptions.EmptyListException; import exceptions.EmptyListException;
import exceptions.EmptySequenceException; import exceptions.EmptySequenceException;
import exceptions.InvalidPositionException; import exceptions.InvalidPositionException;
import position.Position; import position.Position;
import sequence.utility.DNodeIndex; import sequence.utility.ArrayPosition;
/** /**
* Created with MONSTER. * Created with xgiovio.macbookair.
* User: xgiovio * User: xgiovio
* Date: 30/03/2014 * Date: 31/03/14
* Time: 17:19 * Time: 16:12
*/ */
public class ArraySequence<E> extends ArrayIndexList<E> implements Sequence<E> { public class ArraySequence<E> implements Sequence<E> {
private Position<E>[] array;
private int capacity = 100;
private int size = 0;
public ArraySequence (int in){ public ArraySequence() {
super(in); array = (Position<E>[]) new Object[capacity];
} }
@Override public ArraySequence(int in_size) {
array = (Position<E>[]) new Object[in_size];
capacity = in_size;
}
public int size() {
return size;
}
public boolean isEmpty() {
return size() == 0;
}
public E get(int r) throws IndexOutOfBoundsException {
checkIndex(r, size());
return array[r].element();
}
public E set(int r, E e) throws IndexOutOfBoundsException {
checkIndex(r, size());
E temp = array[r].element();
((ArrayPosition<E>)array[r]).setElement(e);
return temp;
}
public void add(int r, E e) throws IndexOutOfBoundsException {
checkIndex(r, size() + 1);
if (size == capacity) {
capacity *= 2;
Position<E>[] B =(Position<E>[]) new Object[capacity];
for (int i=0; i<size; i++)
B[i] = array[i];
array = B;
}
for (int i=size-1; i>=r; i--)
array[i+1] = array[i];
((ArrayPosition<E>)array[r]).setElement(e);
size++;
}
public E remove(int r) throws IndexOutOfBoundsException {
checkIndex(r, size());
E temp = array[r].element();
for (int i=r; i<size-1; i++)
array[i] = array[i+1];
size--;
return temp;
}
public E getFirst() throws EmptySequenceException { public E getFirst() throws EmptySequenceException {
try { try {
E ele = get(0); E ele = get(0);
@@ -32,6 +87,7 @@ public class ArraySequence<E> extends ArrayIndexList<E> implements Sequence<E> {
} }
} }
@Override @Override
public E getLast() throws EmptySequenceException { public E getLast() throws EmptySequenceException {
try { try {
@@ -65,11 +121,12 @@ public class ArraySequence<E> extends ArrayIndexList<E> implements Sequence<E> {
} }
} }
@Override @Override
public Position<E> atIndex(int in_index) throws BoundaryViolationException { public Position<E> atIndex(int in_index) throws BoundaryViolationException {
try { try {
checkIndex(in_index, size()); checkIndex(in_index, size());
return new DNodeIndex<E>(get(in_index),in_index); return array[in_index];
} }
catch (IndexOutOfBoundsException err){ catch (IndexOutOfBoundsException err){
throw new BoundaryViolationException(); throw new BoundaryViolationException();
@@ -79,13 +136,13 @@ public class ArraySequence<E> extends ArrayIndexList<E> implements Sequence<E> {
@Override @Override
public int indexOf(Position<E> position) throws InvalidPositionException { public int indexOf(Position<E> position) throws InvalidPositionException {
checkPosition(position); checkPosition(position);
return ((DNodeIndex<E>) position).getIndex(); return ((ArrayPosition<E>) position).getIndex();
} }
@Override @Override
public Position<E> first() throws EmptyListException { public Position<E> first() throws EmptyListException {
try{ try{
return new DNodeIndex<E>(get(0),0); return array[0];
} }
catch (IndexOutOfBoundsException err){ catch (IndexOutOfBoundsException err){
throw new EmptyListException("Empty Array"); throw new EmptyListException("Empty Array");
@@ -95,18 +152,19 @@ public class ArraySequence<E> extends ArrayIndexList<E> implements Sequence<E> {
@Override @Override
public Position<E> last() throws EmptyListException { public Position<E> last() throws EmptyListException {
try{ try{
return new DNodeIndex<E>(get(size() - 1),size() - 1); return array[size()-1];
} }
catch (IndexOutOfBoundsException err){ catch (IndexOutOfBoundsException err){
throw new EmptyListException("Empty Array"); throw new EmptyListException("Empty Array");
} }
} }
@Override @Override
public Position<E> next(Position<E> p) throws InvalidPositionException, BoundaryViolationException { public Position<E> next(Position<E> p) throws InvalidPositionException, BoundaryViolationException {
DNodeIndex<E> t = checkPosition(p); ArrayPosition<E> t = checkPosition(p);
if (t.getIndex()< size() -1){ if (t.getIndex()< size() -1){
return new DNodeIndex<E>(get(t.getIndex() + 1),t.getIndex() + 1); return array[t.getIndex() + 1];
}else{ }else{
throw new BoundaryViolationException(); throw new BoundaryViolationException();
} }
@@ -114,9 +172,9 @@ public class ArraySequence<E> extends ArrayIndexList<E> implements Sequence<E> {
@Override @Override
public Position<E> prev(Position<E> p) throws InvalidPositionException, BoundaryViolationException { public Position<E> prev(Position<E> p) throws InvalidPositionException, BoundaryViolationException {
DNodeIndex<E> t = checkPosition(p); ArrayPosition<E> t = checkPosition(p);
if (t.getIndex()> 0){ if (t.getIndex()> 0){
return new DNodeIndex<E>(get(t.getIndex() - 1),t.getIndex() - 1); return array[t.getIndex() - 1];
}else{ }else{
throw new BoundaryViolationException(); throw new BoundaryViolationException();
} }
@@ -132,11 +190,13 @@ public class ArraySequence<E> extends ArrayIndexList<E> implements Sequence<E> {
add (size(),e); add (size(),e);
} }
@Override @Override
public void addAfter(Position<E> p, E e) throws InvalidPositionException { public Position<E> addAfter(Position<E> p, E e) throws InvalidPositionException {
try { try {
DNodeIndex<E> t = checkPosition(p); ArrayPosition<E> t = checkPosition(p);
add(t.getIndex() + 1, e); add(t.getIndex() + 1, e);
return array[t.getIndex() + 1];
} }
catch (IndexOutOfBoundsException err){ catch (IndexOutOfBoundsException err){
throw new InvalidPositionException(); throw new InvalidPositionException();
@@ -144,20 +204,22 @@ public class ArraySequence<E> extends ArrayIndexList<E> implements Sequence<E> {
} }
@Override @Override
public void addBefore(Position<E> p, E e) throws InvalidPositionException { public Position<E> addBefore(Position<E> p, E e) throws InvalidPositionException {
try { try {
DNodeIndex<E> t = checkPosition(p); ArrayPosition<E> t = checkPosition(p);
add(t.getIndex() - 1,e); add(t.getIndex() - 1,e);
return array[t.getIndex() - 1];
} }
catch (IndexOutOfBoundsException err){ catch (IndexOutOfBoundsException err){
throw new InvalidPositionException(); throw new InvalidPositionException();
} }
} }
@Override @Override
public E remove(Position<E> p) throws InvalidPositionException { public E remove(Position<E> p) throws InvalidPositionException {
try { try {
DNodeIndex<E> t = checkPosition(p); ArrayPosition<E> t = checkPosition(p);
return remove(t.getIndex()); return remove(t.getIndex());
} }
catch (IndexOutOfBoundsException err){ catch (IndexOutOfBoundsException err){
@@ -168,7 +230,7 @@ public class ArraySequence<E> extends ArrayIndexList<E> implements Sequence<E> {
@Override @Override
public E set(Position<E> p, E e) throws InvalidPositionException { public E set(Position<E> p, E e) throws InvalidPositionException {
try { try {
DNodeIndex<E> t = checkPosition(p); ArrayPosition<E> t = checkPosition(p);
return set (t.getIndex(),e); return set (t.getIndex(),e);
} }
catch (IndexOutOfBoundsException err){ catch (IndexOutOfBoundsException err){
@@ -178,8 +240,10 @@ public class ArraySequence<E> extends ArrayIndexList<E> implements Sequence<E> {
} }
@Override @Override
public String toString() { public String toString() {
String to_return = ""; String to_return = "";
to_return = to_return + "["; to_return = to_return + "[";
@@ -196,13 +260,19 @@ public class ArraySequence<E> extends ArrayIndexList<E> implements Sequence<E> {
return to_return; return to_return;
} }
protected DNodeIndex<E> checkPosition(Position<E> p) throws InvalidPositionException { protected void checkIndex(int r, int n) //
throws IndexOutOfBoundsException { //
if (r < 0 || r >= n)
throw new IndexOutOfBoundsException("Illegal index: " + r);
}
protected ArrayPosition<E> checkPosition(Position<E> p) throws InvalidPositionException {
if (p == null) if (p == null)
throw new InvalidPositionException throw new InvalidPositionException
("Null position passed"); ("Null position passed");
try { try {
DNodeIndex<E> temp = (DNodeIndex<E>) p; ArrayPosition<E> temp = (ArrayPosition<E>) p;
if ( temp.getIndex() >= size() || temp.getIndex() < 0 ) if ( temp.getIndex() >= size() || temp.getIndex() < 0 )
throw new InvalidPositionException throw new InvalidPositionException
("Position does not belong to a valid value"); ("Position does not belong to a valid value");
@@ -213,6 +283,4 @@ public class ArraySequence<E> extends ArrayIndexList<E> implements Sequence<E> {
} }
} }
} }

View File

@@ -0,0 +1,224 @@
package sequence;
import arraylist.ArrayIndexList;
import exceptions.BoundaryViolationException;
import exceptions.EmptyListException;
import exceptions.EmptySequenceException;
import exceptions.InvalidPositionException;
import position.Position;
import sequence.utility.DNodeFake;
/**
* Created with MONSTER.
* User: xgiovio
* Date: 30/03/2014
* Time: 17:19
*/
// fake positions created on the fly. if the element in the array change, it doesn't change on the position retrieved before.
public class ArraySequenceFake<E> extends ArrayIndexList<E> implements Sequence<E> {
public ArraySequenceFake(int in){
super(in);
}
@Override
public E getFirst() throws EmptySequenceException {
try {
E ele = get(0);
return ele;
}
catch (IndexOutOfBoundsException err){
throw new EmptySequenceException();
}
}
@Override
public E getLast() throws EmptySequenceException {
try {
E ele = get(size()-1);
return ele;
}
catch (IndexOutOfBoundsException err){
throw new EmptySequenceException();
}
}
@Override
public E removeFirst() throws EmptySequenceException {
try {
E ele = remove(0);
return ele;
}
catch (IndexOutOfBoundsException err){
throw new EmptySequenceException();
}
}
@Override
public E removeLast() throws EmptySequenceException {
try {
E ele = remove(size() - 1);
return ele;
}
catch (IndexOutOfBoundsException err){
throw new EmptySequenceException();
}
}
@Override
public Position<E> atIndex(int in_index) throws BoundaryViolationException {
try {
checkIndex(in_index, size());
return new DNodeFake<E>(get(in_index),in_index);
}
catch (IndexOutOfBoundsException err){
throw new BoundaryViolationException();
}
}
@Override
public int indexOf(Position<E> position) throws InvalidPositionException {
checkPosition(position);
return ((DNodeFake<E>) position).getIndex();
}
@Override
public Position<E> first() throws EmptyListException {
try{
return new DNodeFake<E>(get(0),0);
}
catch (IndexOutOfBoundsException err){
throw new EmptyListException("Empty Array");
}
}
@Override
public Position<E> last() throws EmptyListException {
try{
return new DNodeFake<E>(get(size() - 1),size() - 1);
}
catch (IndexOutOfBoundsException err){
throw new EmptyListException("Empty Array");
}
}
@Override
public Position<E> next(Position<E> p) throws InvalidPositionException, BoundaryViolationException {
DNodeFake<E> t = checkPosition(p);
if (t.getIndex()< size() -1){
return new DNodeFake<E>(get(t.getIndex() + 1),t.getIndex() + 1);
}else{
throw new BoundaryViolationException();
}
}
@Override
public Position<E> prev(Position<E> p) throws InvalidPositionException, BoundaryViolationException {
DNodeFake<E> t = checkPosition(p);
if (t.getIndex()> 0){
return new DNodeFake<E>(get(t.getIndex() - 1),t.getIndex() - 1);
}else{
throw new BoundaryViolationException();
}
}
@Override
public void addFirst(E e) {
add (0,e);
}
@Override
public void addLast(E e) {
add (size(),e);
}
@Override
public Position<E> addAfter(Position<E> p, E e) throws InvalidPositionException {
try {
DNodeFake<E> t = checkPosition(p);
add(t.getIndex() + 1, e);
return new DNodeFake<E>(get(t.getIndex() + 1),t.getIndex() + 1);
}
catch (IndexOutOfBoundsException err){
throw new InvalidPositionException();
}
}
@Override
public Position<E> addBefore(Position<E> p, E e) throws InvalidPositionException {
try {
DNodeFake<E> t = checkPosition(p);
add(t.getIndex() - 1,e);
return new DNodeFake<E>(get(t.getIndex() - 1),t.getIndex() - 1);
}
catch (IndexOutOfBoundsException err){
throw new InvalidPositionException();
}
}
@Override
public E remove(Position<E> p) throws InvalidPositionException {
try {
DNodeFake<E> t = checkPosition(p);
return remove(t.getIndex());
}
catch (IndexOutOfBoundsException err){
throw new InvalidPositionException();
}
}
@Override
public E set(Position<E> p, E e) throws InvalidPositionException {
try {
DNodeFake<E> t = checkPosition(p);
return set (t.getIndex(),e);
}
catch (IndexOutOfBoundsException err){
throw new InvalidPositionException();
}
}
@Override
public String toString() {
String to_return = "";
to_return = to_return + "[";
for ( int i = 0; i< size() ; i++){
if ( i== size() -1){
to_return+=(get(i).toString());
}else{
to_return+=(get(i).toString() + ",");
}
}
to_return = to_return + "]";
return to_return;
}
protected DNodeFake<E> checkPosition(Position<E> p) throws InvalidPositionException {
if (p == null)
throw new InvalidPositionException
("Null position passed");
try {
DNodeFake<E> temp = (DNodeFake<E>) p;
if ( temp.getIndex() >= size() || temp.getIndex() < 0 )
throw new InvalidPositionException
("Position does not belong to a valid value");
return temp;
} catch (ClassCastException e) {
throw new InvalidPositionException
("Position is of wrong type for this array");
}
}
}

View File

@@ -0,0 +1,51 @@
package sequence.utility;
import exceptions.InvalidPositionException;
import position.Position;
/**
* A simple node class for a doubly-linked list. Each DNode has a
* reference to a stored element, a previous node, and a next node.
*
* @author Roberto Tamassia
*/
//Copyright (c) 2003 Brown University, Providence, RI
//Additional modifications and methods by xgiovio
// used on ArraySequence
public class ArrayPosition<E> implements Position<E> {
private E element = null;
private int index = -1;
public ArrayPosition(E elem, int in_idex) {
element = elem;
index = in_idex;
}
public ArrayPosition(E elem) {
element = elem;
}
public E element() throws InvalidPositionException {
if (index == -1)
throw new InvalidPositionException("Position is not in a list!");
return element;
}
public void setElement(E newElement) { element = newElement; }
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
}

View File

@@ -3,6 +3,7 @@ package sequence.utility;
import exceptions.InvalidPositionException; import exceptions.InvalidPositionException;
import position.Position; import position.Position;
/** /**
* A simple node class for a doubly-linked list. Each DNode has a * A simple node class for a doubly-linked list. Each DNode has a
* reference to a stored element, a previous node, and a next node. * reference to a stored element, a previous node, and a next node.
@@ -12,17 +13,20 @@ import position.Position;
//Copyright (c) 2003 Brown University, Providence, RI //Copyright (c) 2003 Brown University, Providence, RI
//Additional modifications and methods by xgiovio //Additional modifications and methods by xgiovio
public class DNodeIndex<E> implements Position<E> { // used on ArraySequenceFake
public class DNodeFake<E> implements Position<E> {
private E element = null; private E element = null;
private int index = -1; private int index = -1;
public DNodeIndex( E elem, int in_idex) { public DNodeFake(E elem, int in_idex) {
element = elem; element = elem;
index = in_idex; index = in_idex;
} }
public DNodeIndex( E elem) { public DNodeFake(E elem) {
element = elem; element = elem;
} }