ArrayList class separate from Java main file - java

I have two separate files, one named WonderfulArrayList, and the other named ArrayListMain (I'm experimenting with ArrayLists, and I'm not quite sure what to do) and so I have a method in the WonderfulArrayList file, but the main file cannot see the method, which I have named booladdData, which would return true once the data is added to the array list. My WonderfulArrayList file is the following:
import java.util.*;
import java.io.*;
public class WonderfulArrayList{ //implement WonderfulArrayList
public static int ADDNums;
public static int index;
public static int HEADNums;
public static ArrayList<Integer> arr = new ArrayList<Integer>(15);
public static boolean booladdData(ArrayList<Integer>arr){
arr.add(ADDNums);
return true;
}
}
As you can see, I have booladdData instantiated with the ArrayList, named arr. Now, if you look at my main file:
public class ArrayListMain{
//public ArrayList<Integer> arr = new ArrayList<Integer>(15);
public static void main(String[]args){
ArrayList<Integer> arr = new ArrayList<Integer>(15);
int MenuNum = 0;
int ADDNums = 0;
Object Obj = new Object();
Scanner scanner1 = new Scanner(System.in); //set up scanner for user input
while(MenuNum != 7){ //menu loop
Menu(MenuNum);
MenuNum = scanner1.nextInt();
if(MenuNum == 1){
arr.booladdData();
}
For some reason, even though I know that booladdData is created as public and they're both in the same folder, the main file doesn't have the scope to be able to see booladdData in the separate file.
Any idea what I'm doing wrong?

You should be calling WonderfulArrayList.booladdData(arr) instead of arr.booladdData(). The method booladdData() is defined as a class method of your WonderfulArrayList class. It's not an instance method of Java's ArrayList.
You also might want to read into object-oriented programming. Everything in your code is static.

You need to create your type instead of ArrayList
package com.jbirdvegas.test;
import java.util.ArrayList;
public class MainClazz {
public static void main(String[] args) {
// notice I'm creating my type `MyArrayList` instead of `ArrayList` type
MyArrayList myArrayList = new MyArrayList();
myArrayList.add("blah");
System.out.println("My message:" + myArrayList.getSomething());
}
}
class MyArrayList extends ArrayList {
public String getSomething() {
return "something";
}
}
Prints:
My message: something

Related

How to effectively generate object in for or while

I have this kind of structure of program.
This program have one function named run(), and the other function named solve().
In this program, I want to get some information from run() and solve().
Also, I want to put these information to one list vector (named information_one_iteration in the following code).
Because this vectors get together to form a matrix (named information in the following code).
That's why I define the information_one_iteration as static variable, and in every new iteration new objects is defined newly.
But, I know this kind of way is not effective!
How can I improve it?
package java_test2;
import java.util.ArrayList;
import java.util.ArrayList;
import java.util.Random;
public class staticvarTest {
private Random random = new Random();
static ArrayList<ArrayList<String>> information = new ArrayList<ArrayList<String>>();
static ArrayList<String> information_one_iteration = new ArrayList<String>();
public staticvarTest() {
}
public void run() {
for (int i=0; i<10; i++) {
information_one_iteration.add(String.valueOf(i));
solve(); // add two random number generated in function solve()
information.add(information_one_iteration);
information_one_iteration = new ArrayList<String>();
}
print_information(information);
}
public void solve() {
information_one_iteration.add(String.valueOf(random.nextInt()));
information_one_iteration.add(String.valueOf(random.nextInt()));
}
public static void print_information(ArrayList<ArrayList<String>> information) {
for (ArrayList<String> newLine : information) {
ArrayList<String> list_set = newLine;
System.out.println("");
for(String data: list_set) {
System.out.print(data+" ");
}
System.out.println("");
}
System.out.println("");
}
public static void main(String args[]) {
staticvarTest na = new staticvarTest();
na.run();
}
}
Since you are not using static ArrayList<String> information_one_iteration = new ArrayList<String>(); anywhere apart from the run method you can remove it.
I have changed the random variable since it's okay for multiple objects to share it - the behaviour remains the same therefore no need to initialize every time Main object is created.
Change the solve method to take a ArrayList as a parameter too.
print_information looks okay but there is no need for ArrayList<String> list_set = newLine;
I have also made information as a state variable over a static variable so that each instance of the object can have it's own information therefore allowing you to run multiple instances of this class.
I also added a lambda to print the members to give you an idea about them newLine.forEach(data -> System.out.println(data + " "));.
Finally I have used variable names and class names that adhere to Java coding conventions for better readability. Here is one of the style guides which you may follow https://google.github.io/styleguide/javaguide.html
The cleaned up version of your code is below
package com.company;
import java.util.ArrayList;
import java.util.Random;
public class Main {
private static Random random = new Random();
private ArrayList<ArrayList<String>> information = new ArrayList<>();
private void run() {
for (int i=0; i<10; i++) {
ArrayList<String> informationInIteration = new ArrayList<>();
informationInIteration.add(String.valueOf(i));
solve(informationInIteration); // add two random number generated in function solve()
information.add(informationInIteration);
}
printInformation();
}
private void solve(ArrayList<String> iterationInformation) {
iterationInformation.add(String.valueOf(random.nextInt()));
iterationInformation.add(String.valueOf(random.nextInt()));
}
private void printInformation() {
for (ArrayList<String> newLine : information) {
System.out.println();
newLine.forEach(data -> System.out.println(data + " "));
System.out.println();
}
System.out.println();
}
public static void main(String[] args) {
Main main = new Main();
main.run();
}
}
Based on your comments I am adding a method that creates no object for storing any information.
package com.company;
import java.util.Random;
public class Main {
private Random random = new Random();
private void run() {
for (int i=0; i<10; i++) {
System.out.println(String.valueOf(i));
System.out.println(random.nextInt() + " " + random.nextInt() + "\n");
}
}
public static void main(String[] args) {
Main main = new Main();
main.run();
}
}
This should work for you.
public void run() {
for (int i=0; i<10; i++) {
staticvarTest.information.add(solve(String.valueOf(i)));
}
print_information(information);
}
public String[] solve(String i) {
return {String.valueOf(random.nextInt()),
String.valueOf(random.nextInt()),
i};
}
Or you could maybe concatenate the array returned in solve() and the i String and avoid passing the variable around.
I have not tested the code above btw but apart from accessing and modifying the static variable there shouldn't be a problem.
Hope this works for you.

Calling Methods in Main Class and Other Class Differences in Java

I have 3 classes, Mainn, ReadFile, and Entry.
ReadFile is basically my class that does all file i/o stuff.
How come I am able to access ReadFile in my Mainn class just fine, but
when I try to access it in Entry "e.openFile()" i get an error that says identifier expected.
I know this can be fixed by making an overloaded method openFile() in Entry but why is this needed in Entry, but not in the main class Mainn?
package homework6;
public class mainn {
public static void main(String[] args){
ReadFile r = new ReadFile();
r.openFile();
//r.readFile();
r.skipFirst();
String x[] = r.getData();
String y[] = r.getData();
String z[] = r.getData();
System.out.println(x[0] + "," + x[1]);
System.out.println(y[0] + "," + y[1]);
System.out.println(z[0] + "," + z[1]);
r.closeFile();
}
}
ReadFile:
package homework6;
import java.util.*;
import java.io.*;
public class ReadFile {
Scanner x = null;
public void openFile(){
try{
x = new Scanner(new FileInputStream(
"C:\\Users\\Rohan Vidyarthi\\workspace\\Data.csv"));
}
catch(FileNotFoundException e){
System.out.println("File not found error");
}
}
public void readFile(){
while (x.hasNextLine())
System.out.println(x.nextLine());
}
public void skipFirst(){
x.nextLine();
}
public String[] getData(){ //returns String[] with Date and ADJ Close
String[] temp;
String[] out = new String[2];
temp = (x.nextLine()).split(",");
out[0] = temp[0];
out[1] = temp[6];
return out;
}
public boolean checker(){
return x.hasNextLine();
}
public void closeFile(){
x.close();
}
}
class Entry:
package homework6;
public class Entry extends ReadFile{
ReadFile e = new ReadFile();
e.openFile();
double minn = Double.MAX_VALUE;
double maxx = Double.MIN_VALUE;
/*public String[] rMax(){
String[] temp1;
String[] temp2;
}
*/
}
I suggest you move your openFile() logic to the ReadFile class constructor as shown below and this approach will give you two advantages:
(1)scanner (which is a mandatory variable of ReadFile class) gets initialized inside the class constructor which makes more sense and avoids all NullPointerException i.e., someone accidentally calling other methods first before openFile() (Always ensure that all mandatory instance variables i.e., data is being initialized by the constructors, I strongly suggest make it as a practice and never allow any object being created freely without being the mandatory variables initialized through constructors which will avoid most of the issues).
(2) It will fix your problem automatically as you don't need a call to openFile() method (well, you don't have that method itself, ReadFile constructor has initialized the scanner).
public class ReadFile {
Scanner x = null;
public ReadFile() {
try{
x = new Scanner(new FileInputStream(
"C:\\Users\\Rohan Vidyarthi\\workspace\\Data.csv"));
}
catch(FileNotFoundException e){
System.out.println("File not found error");
}
}
public void readFile(){
//add code
}
public void skipFirst(){
//add code
}
public String[] getData(){
//add code
}
public boolean checker(){
return x.hasNextLine();
}
public void closeFile(){
x.close();
}
}
Just ensure that you don't need to call openFile() anymore as shown below:
public class Entry extends ReadFile{
ReadFile e = new ReadFile();//initializes scanner as well
public String[] readFile() {//add any methods you like here in this like
return e.readFile();
}
double minn = Double.MAX_VALUE;
double maxx = Double.MIN_VALUE;
}
How come I am able to access ReadFile in my Mainn class just fine, but
when I try to access it in Entry "e.openFile()" I get an error that
says identifier expected.
In Java, invocation of any method call (like your r.openFile()) should be done from another method or from constructor or from initializers (static or instance initializer), so the answer is in your Mainn class, you are calling the openFile() inside from main(String[] args) method whereas in your Entry class your openFile() method call is not wrapped inside any of the above-mentioned code blocks (i.e., methods, constructors, initializers).
One more important point is that in general when you say A extends B in Object Oriented Languages, it means that A IS-A type of B, but in your code Entry extends ReadFile does not make much sense, so you should avoid that.
put e.openFile(); in a method or constructor. You cannot place floating codes outside methods. Any statement can only be used inside the block of codes (i.e. methods, constructors, static initializers)
If you do
public class mainn {
ReadFile r = new ReadFile();
r.openFile();
//r.readFile();
r.skipFirst();
String x[] = r.getData();
...
you will receive the same error in mainn

Java - Getting the value of a method inside of a class

I am trying to get the value of a method that is inside a class into the main class.
The code is supposed to let me give the variables 'a', 's' and 'u' each a value by using the console and afterwards return the values to the main class.
import java.util.*;
public class Auslesen
{
String a;
private int s;
double u;
public class Scannen
{
Scanner scanner = new Scanner(System.in);
public int Methode()
{
s = scanner.nextInt();
return s;
}
}
}
and here is my main class:
public class Start
{
public static void main(String[] args)
{
Auslesen auslesen = new Auslesen();
//System.out.println(auslesen);
Auslesen.Scannen scannen = auslesen.new Scannen();
//System.out.println(scannen);
Auslesen.Scannen.Methode methode = scannen.new Methode();
System.out.println(methode);
//my approach which didnt worked out...
}
}
Methode is a method not a class. You don't create it with new or create it at all for that matter. A method is defined in a class and you just call it. E.g.
System.out.println(scannen.Methode());
and delete this line :
Auslesen.Scannen.Methode methode = scannen.new Methode();
Also try to stick to the Java naming convention : class names start with uppercase method and variable names with lowercase.
First of all why are you declaring a class inside another class ? If you simply want to return a value from one class to another class then you can do something like this -
String a;
private int s;
double u;
Scanner scanner = new Scanner(System.in);
public int Methode()
{
s = scanner.nextInt();
return s;
}
now in the main method just call the method -
Auslesen a=new Auslesen();
System.out.println("The entered number is: "+a.Methode());

Java I have an Array that cannot be resolved across a class

I have an Array that is in a class called MusicArray
and I want to be able to print its data and search it in my SearchClass class
import java.util.Arrays;
import java.util.Scanner;
public class Searchclass {
public static void main(String[] args) {
MusicArray ma = new MusicArray();
for(int count = 1; count <= songDetails.length; count++){
System.out.println(SongDetails.length);
System.out.println(songDetails[count - 1]);}
In the MusicArray class I have this
public Music[] getSongDetails() {
return songDetails;
I though that this code snippet made the array availabe to the other classes
What am I missing?
You need to use the ma object to retrieve the array, like this:
Music[] songDetails = ma.getSongDetails();
Then you can iterate over the Music[] array.
You should use ma.getSongDetails() to access the array from your SearchClass.
import java.util.Arrays;
import java.util.Scanner;
public class Searchclass {
public static void main(String[] args) {
MusicArray ma = new MusicArray();
Music [] details = ma.getSongDetails();
for(int count = 0; count < details.length; count++)
{
System.out.println(details.length);
System.out.println(details[count]);
}
}
}
Unfortunately, this code will probably still have problems. You don't add any instances of Music to MusicArray, so either the array will be null (you'll see a NullPointerException) or empty (nothing will print.)

copying array values from one class to another

Im stuck with the following problem,
I've two classes, the first is readFromFile and the second class is newClass
readFromFile.java -
This reads a text file
Parses the lines of text into seperate strings
The values of these strings are stored in a String [ ] called dArray
For testing I've printed all values out and it works
newClass.java
This class is intended to copy the value of the string [ ] dArray into a new string and from there use the values ( for simplicity all I've included in the newClass is the code relating to copying the array)
What I'm doing wrong is that I'm returning dArray but its returning an array with nothing stored in it, so I either need a way to call main method from readFromFile.class / help creating a method in readFromFile that would do the same which I call from main
please help
import java.util.Scanner;
import java.io.*;
public class readFromFile
{
static String[] dArray = new String [30];
public static void main (String[] args) throws IOException
{
String part;
Scanner fileScan, partScan;
int i = 0;
int x = 0;
fileScan = new Scanner (new File("C:\\stuff.txt"));
// Read and process each line of the file
while (fileScan.hasNext())
{
part = fileScan.nextLine();
partScan = new Scanner (part);
partScan.useDelimiter(":");
while ( partScan.hasNext()){
dArray[i] = partScan.next();
i++;
}
}
for (x = 0;x<i;x++)
{ System.out.println(dArray[x]);
}
}
public String[] getArray()
{
return dArray;
}}
newClass.java
public class newClass {
readFromFile results = new readFromFile();// creating object from class readFromFile
public void copyArray() {
String[] dArray = results.getArray(); // Trying to return the values of String [] dArray from rr classs
//Method getArray in rr class is
// public String[] getArray()
// { return dArray; }
String[] arrayCopy = new String[dArray.length];
System.arraycopy(dArray, 0, arrayCopy, 0, dArray.length);
for (int i = 0; i < arrayCopy.length; i++)
System.out.println(arrayCopy[i]);
}
public static void main(String[] args) {
newClass.copyArray();
}
}
Your results generation is in readFromFile.main(), but you're expecting to call it in your readFromFile(). You need to make a constructor for readFromFile, and call that in your main method, as well.
The problem is that both classes have a main method. Only the class that you intend to run should have a main method, the other classes need only constructors. Assuming you want to run a unshown class it would be written like this.
public class ThirdClass{
public static void main(String[] args) {
readFromFile reader = new ReadFromFile();
newClass copy = new newClass();
reader.readFromFile();
String[] strings = reader.getArray();
copy.copyArray(strings)
}
For this to work you need to put all of the code in the main of readFromFile in a method called "readFromFile". and you need a method in newClass that accepts a string array as an argument. Or a constructor that accepts a string array.
Make sure that neither of them have main methods or it won't work.
Remove the static keyword before your dArray variable
Change public static void main(String[] args) throws IOException in your first class to public readFromFile() throws IOException. Keep the code inside it the same.
Change the line newClass.copyArray(); in your second class to (new newClass()).copyArray();
Move the line in your second class readFromFile results = new readFromFile(); into the public void copyArray() method.
Change public void copyArray() in your second class to public void copyArray() throws IOException
Put a try..catch block around your code in the second class's main method. i.e. change (new newClass()).copyArray(); to something like try { (new newClass()).copyArray(); } catch (IOException e) { e.printStackTrace(); }
The above should get your thing working, but a friendly note would be to experiment with the code (once it works) since it's an excellent example to understand how static keywords are used, how Exceptions are handled or thrown, and how IO is used. ;)

Categories

Resources