jeudi 30 octobre 2014

How can I parse a string for a set?


Vote count:

0




So I am writing a method that is supposed to take an input String of the format "s1:{1,2,3,4}" and put it into a set. The set class I have developed myself and is as follows:



public class Set<E> implements Iterable<E> {
private static final int DEFAULT_CAPACITY = 20;

private String name;

private E[] theData;

private int size = 0;

private int capacity = 0;


public Set(){
capacity = DEFAULT_CAPACITY;
theData = (E[]) new Object[capacity];
}//end constructor

public Set(String name){
capacity = DEFAULT_CAPACITY;
theData = (E[]) new Object[capacity];
this.name = name;
}//end constructor

public String getName(){
return name;
}//end getName

public void setName(String name){
this.name = name;
}//end setName

//adds object to set
public void add(Object E){
if (size == capacity){
reallocate();
}//end if
theData[size] = (E) E;
size++;
for (int j = 0; j<size; j++){
for (int k = 0; k < size; k++){
if ((int)theData[j] < (int)theData[k]){
E temp = theData[j];
theData[j] = theData[k];
theData[k] = temp;
}//end if
}//end nested for loop
}//end for loop
int counter = 0;
for (int i = 0; i < size; i++){
if (E == theData[i]){
counter++;
if (counter >= 2){
remove((Object)E);
}//end nested if
}//end if
}//end for loop
}//end add method

public E get(int i){
if (i < 0 || i >= size){
throw new ArrayIndexOutOfBoundsException(i);
}//end if
else{
return theData[i];
}//end else
}//end get method

public E remove(int i){
if (i < 0 || i >= size){
throw new ArrayIndexOutOfBoundsException(i);
}//end if
E returnValue = theData[i];
for (int j = i + 1; j < size; j++){
theData[j - 1] = theData[j];
}//end for loop
size--;
return returnValue;
}//end remove method

public void remove(Object E){
for (int i = 0; i < size; i++){
if (E == theData[i]){
for (int j = i + 1; j < size; j++){
theData[j - 1] = theData[j];
}//end nested for loop
size--;
}//end if
}//end for loop
}//end remove method

//fix!
public int find(Object E){
int first, last, middle;
first = 0;
last = size - 1;
middle = (first+last) / 2;
while( first <= last ){
if ((int)theData[middle] > (int)E ){
last = middle - 1;
}//end if
else if ((int)theData[middle] < (int)E ){
first = middle + 1;
}//end else if
else{
return middle;
}//end else
}//end while
if (first > last){
return -1;
}//end if
return -1;


}//end find method

public Set<E> union(Set<E> s){
Set<E> returnSet = new Set<E>();
for (int i = 0; i < this.size; i++){
returnSet.add(this.theData[i]);
}//end for loop
for (int i = 0; i < s.size; i++){
returnSet.add(s.theData[i]);
}//end for loop
return returnSet;
}//end union method

public Set<E> intersect(Set<E> s){
Set<E> returnSet = new Set<E>();
for (int i = 0; i < this.size; i++){
for (int j = 0; j < s.size; j++){
if (this.theData[i] == s.theData[j]){
returnSet.add(theData[i]);
}//end if
}//end nested for loop
}//end for loop
return returnSet;
}//end intersect method

public Set<E> subtract(Set<E> s){
Set<E> returnSet = new Set<E>();
for (int i = 0; i < this.size; i++){
for (int j = 0; j < s.size; j++){
if (this.theData[i] == s.theData[j]){
this.remove((Object)this.theData[i]);
s.remove((Object)s.theData[j]);
}//end if
}//end nested for loop
}//end for loop
for (int i = 0; i < this.size; i++){
returnSet.add(this.theData[i]);
}//end for loop
for (int i = 0; i < s.size; i++){
returnSet.add(s.theData[i]);
}//end for loop
return returnSet;
}
//end subtract method
public boolean equals(Set<E> s){
boolean result = false;
for (int i = 0; i < this.size; i++){
if (this.theData[i] == s.theData[i]){
result = true;
}//end if
if (this.theData[i] != s.theData[i]){
result = false;
break;
}//end if
}//end for loop
return result;
}//end equals method


private void reallocate(){
capacity = 2*capacity;
theData = Arrays.copyOf(theData, capacity);
}//end reallocate method

public String toString(){
StringBuilder set = new StringBuilder();
set.append("{");
for (int i = 0; i < size; i++){
set.append(theData[i]);
if (i != size-1){
set.append(",");
}//end if
}//end for loop
set.append("}");
return set.toString();
}//end toString()

public SetIterator<E> iterator() {
SetIterator<E> it = new SetIterator<E>() {

private int currentIndex = 0;


public boolean hasNext() {
if (currentIndex < size && theData[currentIndex] != null){
currentIndex++;
return true;
}//end if
else{
return false;
}//end else
}//end hasNext()


public E next() {
if (!hasNext()) {
throw new NoSuchElementException();
}//end if
return theData[currentIndex++];
}//end next()


public boolean hasPrevious() {
if (currentIndex <= size && currentIndex > 0){
currentIndex--;
return true;
}//end if
else{
return false;
}//end else
}//end hasPrevious()


public E previous() {
if (!hasPrevious()) {
throw new NoSuchElementException();
}//end if
return theData[currentIndex--];
}//end previous()


public void add(E item) {
theData[currentIndex-1] = item;
}//end add()


public void remove() {
for (int i = 0; i < size; i++){
if (theData[currentIndex] == theData[i]){
for (int j = i + 1; j < size; j++){
theData[j - 1] = theData[j];
}//end nested for loop
size--;
}//end if
}//end for loop
}//end remove()

};//end new SetIterator()
return it;

}//end iterator method

}//end Set class


Also, the method is supposed to throw an exception if the method has invalid format such as s1:[1 2,3,4} this example being the missing comma and curly brace. Also the input may have any number of whitespaces and will still be considered valid an example being s1: {1, 2, 3, 4 }. So far all I have for the method is:



public Set<Integer> parse(String input){
String s[] = input.split(":");
String name = s[0];
Set<Integer> returnSet = new Set<Integer>(name);




return returnSet;
}


I am not sure how to properly get the elements out of the set in the string and put them into a Set object. I know I can parseInt once I get them by themselves but I am having trouble isolating each element. Also, there is no limit on how many elements a set can have which means my code has to work for any number of elements. I have also considered regular expressions but I feel as if there is a more efficient way of doing this that I am overlooking. Any help will be appreciated.



asked 2 mins ago







How can I parse a string for a set?

Aucun commentaire:

Enregistrer un commentaire