Loop calling update() method of each class with different parameters - java

Say I have 3 different classes (Class1, Class2, Class3), and each class has a method called ".update(String x)".
Now I want to read a line in a .csv file, I separate the values by comma and get a list with each string value indexed , for example "Foo, bar, barz" becomes {"foo", "bar", "barz").
Is it possible in Java to make a list of objects (Obj1, Obj2, Obj3), one for each class and for each value on my list of strings, call the .update of each object with the according index of my list of strings as the parameter?
for example:
package Test;
import java.util.ArrayList;
import java.util.List;
class Class1{
private String string;
public void update(String s){
this.string = s;
}
public String str(){
return this.string;
}
}
class Class2{
private String string;
public void update(String s){
this.string = s;
}
public String str(){
return this.string;
}
}
class Class3{
private String string;
public void update(String s){
this.string = s;
}
public String str(){
return this.string;
}
}
public class Testing {
public static void main(String[] args) {
List<Object> object = new ArrayList<Object>();
Class1 class1 = new Class1();
Class2 class2 = new Class2();
Class3 class3 = new Class3();
object.add(class1);
object.add(class2);
object.add(class3);
String string_list[] = {"foo" , "bar", "barz"};
for(int i = 0 ; i < object.size(); i++) {
object.get(i).update(string_list[i]);
}
}
}
hence obj1.update("foo"), obj2.update("bar"), obj3.update("barz")
I keep getting a "cannot resolve method" error in the loop.
Error:(68, 26) java: cannot find symbol
symbol: method update(java.lang.String)
location: class java.lang.Object)
But when I change the object reference in the loop to an object and not a reference it works fine. Logically it seems correct, but it seems like an ArrayList list isn't the right data structure to hold objects? or maybe it is and I'm doing it wrong, anyone have any suggestions why it's not working and how I can fix it?
Thanks.

you can do that, but for that you need your list of objects to be of a type that declares the update() method. If you want the objects to be of different classes, you need to have some interface or abstract class that all three implement/extend, and that interface/abstract class should declare update method.
should be something like this:
public interface MyInterface {
public void update(String str);
}
public class Object1 implements MyInterface {
#Override
public void update(String str) {
...
}
}
/// same for object 2 and 3
String[] string_list = {"foo", "bar", "barz"}
MyInterface[] obj_list = {Obj1, Obj2, Obj3}
...
...

Related

Is it possible to use toString on undeclared object?

I want to print "None" value for undeclared objects instead of null. Is it possible?
public class class1 {
class2 c2;
public static void main(String[] args) {
class1 c1=new class1();
System.out.println(c1.c2);
}
}
class class2{
public String toString(){
if(this==null){
return "None";
}else{
return "Correct";
}
}
}
Edit: I have added the code. This code prints:
null
But I want to print "None". What should I do?
The utility class Objects offers a lot of useful methods. There's for example Objects#toString(Object) and Objects#toString(Object, String).
final String s = Objects.toString(obj, "None");
After your edit: the this reference is never null, therefore this == null will always be false. You need to handle the null-check outside of your class. Normally, String.valueOf will be called when converting an object to a string. This method handles null references, not the class itself. You'd have to manually convert your object to a string first (with the utility described above).
You'd need to change your code:
public class Class1 {
Class2 c2;
public static void main(String[] args) {
Class1 c1 = new Class1();
System.out.println(Objects.toString(c1.c2, "None"));
}
}
class Class2 {
#Override
public String toString(){
return "Correct";
}
}
You can always create a wrapper around Objects#toString(Object,String) to avoid specifying the default value over and over again:
public final class MyObjects {
private MyObjects(){}
public static String toString(final Object obj) {
return Objects.toString(obj, "None");
}
}

Getting issue in adding data to List

I have two classes namely Test and Demo and in Demo class I have a class variable namely List. I somehow need to put/add the given two strings into List but it will only accept objects of Test class. Is there a way I can add the given strings to List.
class Test{
List<Test> getdataFromDemo(){
return Demo.getData;
}
}
class Demo{
public static List<Test> getData=new LinkedList<Test>;
static void D1(){
String str1="TestOne";
String str2="TestTwo";
}
getData.add(str1);//need to add str to getData but this is showing error
getData.add(str2);
System.out.println(getData)
You are trying to store a String in your generic list of Test. You need to create an attribute in Test of the type String and set it within the constructor. Then you need to add the new objects of Test with the Strings str1 and str2 in the constructor to the list.
public class Test {
public String name;
Test(String name) {
this.name = name;
}
List < Test > getdataFromDemo() {
return Demo.getData;
}
}
class Demo {
public static List < Test > getData = new LinkedList < Test > ();
public static void main(String[] args) {
String str1 = "TestOne";
String str2 = "TestTwo";
getData.add(new Test(str1)); // need to add str to getData but this is showing error
getData.add(new Test(str2));
System.out.println(getData);
}
}
Add a field variable in test class of string and initialize its in constructor.
or just set the string directly using setters and fetch it using getters.
class Test{
public String testString;
public void setTestString() {
this.testString=testString;
}
public String getTestString() {
return this.testString;
}
List<Test> getdataFromDemo(){
return Demo.getData;
}
}
class Demo{
public static List<Test> getData=new LinkedList<Test>;
static void D1(){
String str1="TestOne";
String str2="TestTwo";
}
Test test1 = new Test()
test1.setTestString( str1);
getData.add( test1);//need to add str to getData but this is showing error
Test test2 = new Test()
test2.setTestString( str2);
getData.add(test2);
System.out.println(getData)

How to add multiple objects types in the same list in Java

Am new in java and try to get over it. I have data like (String URL, int Score) and i want to implement it in Array List. I've searched about how to implement multiple type of variable in ArrayList or LinkedList and found that the solution is to create sub class from super class and i create this sub class:
public class MySubClass extends MyList{
public String URL;
public int UrlScore;
public MySubClass (String a, int b){
URL = a;
UrlScore = b;
}
}
And my super class is:
import java.util.ArrayList;
public class MyList {
public static void main(String[] args) {
ArrayList <MySubClass> myList_1 = new ArrayList <MySubClass> ();
myList_1.add("http://www.something.com", 5);
System.out.println(myList_1);
}
}
I've got error when i try to use Add Add object ? The error said:
The method add(int, MySubClass) in the type ArrayList is not applicable for the arguments (String, int)
Can you tell me please where am doing the wrong ? And how can i fixed it ? Thanks in advance.
You can fix it via creating object of MySubClass and adding it to the list E.g.
MySubClass obj = new MySubClass("http://www.something.com", 5);
myList_1.add(obj);
You are supposed to add an instance of MySubClass to the list :
myList.add(new MySubClass("http://www.something.com", 5));
BTW, there is no need for MySubClass to be a sub-class of MyList.
As mentioned in the comments, you should override the toString() method in your MySubClass in order to display each instance of MySubClass as you wish.
A possible implementation :
public class MySubClass
{
public String URL;
public int UrlScore;
public MySubClass (String a, int b)
{
URL = a;
UrlScore = b;
}
public String toString()
{
return URL + "=" + UrlScore;
}
}
import java.util.ArrayList;
public class MyList {
public static void main(String[] args) {
ArrayList <MySubClass> myList_1 = new ArrayList <MySubClass> ();
MySubClass myobj = new MySubClass("http://www.something.com", 5);
myList_1.add(myobj);
}
}
Try something like that and the code will work.

Keeping the contents of tables from one class to another class in java

I want to use a table already filled in a first class and keep the content of the table to make changes in a second class
ClassA:
public class ClassA {
public String catas[][]=new String[100][100];
public int type[][]=new int[100][100];
//code lines
public int createInitBlocr1 (StringBuffer sb, Node trn, int y, Object[] a)
{
//code lines
catas[y][f]=trn.getName();
type[y][f]=trn.getType();
}
public int[][] getType(){
return type;
}
public String[][] getCatas(){
return catas;
}
}
ClassB:
public class ClassB extends JFrame {
ClassA c = new ClassA();
String[][] nom = c.getCatas();
int[][] nom = c.getType();
private void jbInit() throws Exception {
//using the content of tables and make changes
}
}
My problem is in ClassB I have tow empty tables not the same content I have in ClassA
Not sure your question. You want copies of ClassA's arrays in ClassB?
Use System.arrayCopy()
otherwise B's arrays will just be references to A's.
In ClassB, after ClassA c = new ClassA(), you should call c.createInitBlocr1(...). Then c.getCatas() and c.getType() will return the instances you are looking for: always the same instances.

String s1=new String("demo"); While printing why does it give output as the given string?

If we create a String like below and print the value:
String s=new String("demo");
System.out.println(s);
...the output is:
demo
Good. This is the expected output. But here String is a class. Remember that. Below is another example. For example, take a class like this:
class A
{
public static void main (String args[])
{
A a =new A();
A a1=new A("hi"); //we should create a Constructor like A(String name)
System.out.println(a1); //here O/P is address
}
}
My doubt is that I created the A instance in the same way I created the new String object, and I printed that object. So why does it not print the given String for the instance of A?
You need to override the Object#toString() in your class. By default, the toString() method of Object is called.
Also, to print the value, you just need to override the method as internally a call will be made to the toString() method when this statement is executed.
System.out.println(a1);
Sample overriden toString() method.
#Override
public String toString() {
// return a string value
return "The String representation of your class, as per your needs";
}
You have to override toString() method in your class the way you want to print something when call System.out.println();. In String class toString() method has override and you will get out put above due to that.
As pointed out already, you need to override the default toString() method inherited from the Object class. Every class automatically extends the Object class, which has a rather simple toString(), which can't know how to turn your particular object into a String. Why should it, especially if your class is arbitrarily complex? How is it supposed to know how to turn all your class's fields into a "sensible" string representation?
In the toString() of your class, you need to return the string that you want to represent your class with. Here is a simple example:
class A {
String foo;
public A(String foo) {
this.foo = foo;
}
public String toString() {
return foo;
}
}
public class sample {
public static void main(String[] args) {
A a = new A("Hello world!");
System.out.println(a);
}
}
String is a class whose purpose is to hold a string value and will return that value if referenced. When you use other classes, you will usually want to add other behavior. If you want to use the class to hold different values that you can set (on object creation or later in processing) you may want to use "setter" and "getter" methods for such values.
Here is an example:
public class Snippet {
private static final String C_DEFAULT_VALUE = "<default value>";
private String name;
private static Snippet mySnippet;
public Snippet() {
}
public Snippet(String value) {
setName(value);
}
/**
* #param args
*/
public static void main(String[] args) {
if (args != null && args.length > 0) {
mySnippet = new Snippet(args[0]);
} else {
mySnippet = new Snippet(C_DEFAULT_VALUE);
}
System.out.println(mySnippet.getName());
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}

Categories

Resources