This is what I have so far in my prepending array. // IntArray.java public class
ID: 3815284 • Letter: T
Question
This is what I have so far in my prepending array.
// IntArray.java
public class IntArray {
// Int array representing the internal data.
private int[] a;
private int length;
// main function to verify.
public static void main(String args[]){
IntArray arr = new IntArray();
arr.add(1);
arr.add(2);
arr.add(3);
arr.add(4);
arr.add(5);
arr.add(6);
arr.add(7);
arr.add(8);
arr.add(9);
prepend(arr, 10);
for(int i=0;i<arr.length;i++){
System.out.println(arr.a[i]);
}}
private static void prepend(IntArray arr, int i) {
}
public IntArray() {
a = new int[9];
length = 0;
}
public int get(int i) {
if (i < 0 || i >= length) {
throw new ArrayIndexOutOfBoundsException(i);
}
return a[i];
}
public void set(int i, int value) {
if (i < 0 || i >= length) {
throw new ArrayIndexOutOfBoundsException(i);
}
a[i] = value;
}
public int size() {
return length;
}
public void add(int value) {
if (length >= a.length) {
int[] b = new int[a.length * 3];
int i;
for (i = 0; i < a.length; i++) {
b[i] = a[i];
}
b[i] = value;
a = b;
}
else{
a[length] = value;
}
length += 1;
}
public void prepend(int value){
if(length>=a.length){
int[] c = new int[a.length*3];
// add value to first index
c[0] = value;
// moving each element to new array by increasing it's index
for(int i=0;i<a.length;i++){
c[i+1] = a[i];
}
a = c;
}
else{
// increasing the index of each element.
for(int i=length;i>=0;i--){
a[i+1] = a[i];
}
// adding value to first index.
a[0] = value;
}
length += 1;
}
}
In a tester program, I get stopped at
System.out.println("OK. Now running a speed test prepending and adding a million values.");
long start = System.currentTimeMillis();
for (int i = 0; i < 1000000; i++) {
a.prepend(-501 - i); ( Specifically this line )
}
for (int i = 0; i < a.size(); i++) {
if (a.get(i) != -1000500 + i) {
throw new RuntimeException(
"Expected a.get(" + i + ") == " + (-1000500 + i) + " instead was " + a.get(i));
}
for (int i = 0; i < 1000000; i++) {
a.add(521 + i);
}
if (a.size() != 2001021) {
throw new RuntimeException("Size should now be 2001021, instead I got " + a.size());
}
for (int i = 0; i < a.size(); i++) {
if (a.get(i) != -1000500 + i) {
throw new RuntimeException(
"Expected a.get(" + i + ") == " + (-1000500 + i) + " instead was " + a.get(i));
}
}
for (int i = 0; i < a.size(); i++) {
a.set(i, a.size() - i);
}
for (int i = 0; i < a.size(); i++) {
if (a.get(i) != 2001021 - i) {
throw new RuntimeException("After resetting the whole array and calling a.get(i) I expected "
+ (2001021 - i) + " but got " + a.get(i));
}
}
long end = System.currentTimeMillis();
if (end - start < 1000) {
System.out.println("OK. You took " + (end - start) + " milliseconds, not bad!");
System.out.println("****** Everything looks OK! ******");
score += 10;
} else {
System.out.println("OK, but you took " + (end - start)
+ " milliseconds, which seems too long (I'm expecting 1000 or less; my laptop takes between 61 and 100 in my implementations). Please let me know if you feel this is in error.");
}
} catch (Exception e) {
e.printStackTrace(System.out);
}
How do i fix my array program to run all the way through the tester program ? Please help ! Thanks in advance
Explanation / Answer
//there was just one bug in your prepend method you have put i=length but it should be length-1 because in your array
// array index starts from 0.
import java.util.Arrays;
public class IntArray {
// Int array representing the internal data.
private int[] a;
private int length;
// main function to verify.
public static void main(String args[]){
IntArray arr = new IntArray();
arr.add(1);
arr.add(2);
arr.add(3);
arr.add(4);
arr.add(5);
arr.add(6);
arr.add(7);
arr.add(8);
arr.add(9);
arr.prepend(10);
for(int i=0;i<arr.length;i++){
System.out.println(arr.a[i]);
}}
private static void prepend(IntArray arr, int i) {
//empty
}
//constructor
public IntArray() {
a = new int[9];
length = 0;
}
public int get(int i) {
if (i < 0 || i >= length) {
throw new ArrayIndexOutOfBoundsException(i);
}
return a[i];
}
public void set(int i, int value) {
if (i < 0 || i >= length) {
throw new ArrayIndexOutOfBoundsException(i);
}
a[i] = value;
}
public int size() {
return length;
}
public void add(int value) {
if (length >= a.length) {
int[] b = new int[a.length * 3];
int i;
for (i = 0; i < a.length; i++) {
b[i] = a[i];
}
b[i] = value;
a = b;
}
else{
a[length] = value;
}
length += 1;
}
public void prepend(int value){
if(length>=a.length){
int[] c = new int[a.length*3];
// add value to first index
c[0] = value;
// moving each element to new array by increasing it's index
for(int i=0;i<a.length;i++){
c[i+1] = a[i];
}
a = c;
}
else{
// increasing the index of each element.
for(int i=length-1;i>=0;i--){// changed i=length-1
a[i+1] = a[i];
}
// adding value to first index.
a[0] = value;
}
length += 1;
}
public String toString()
{
return String.format(Arrays.toString(a));
}
}
Note: in your tester you have i as the variable in multiple nested for loops . It will produce a compile time error
Related Questions
drjack9650@gmail.com
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.