How to create an array in recursive function in java - java

I have a recursive method that prints out the values in command line. I need to create a temp array with the result an display it using Swing. how do I create the array and store the values each time it loops ?
static void listSnapshots(VirtualMachine vm)
{
if(vm == null)
{
JOptionPane.showMessageDialog(null, "Please make sure you selected existing vm");
return;
}
VirtualMachineSnapshotInfo snapInfo = vm.getSnapshot();
VirtualMachineSnapshotTree[] snapTree = snapInfo.getRootSnapshotList();
printSnapshots(snapTree);
}
static void printSnapshots(VirtualMachineSnapshotTree[] snapTree)
{
VirtualMachineSnapshotTree node;
VirtualMachineSnapshotTree[] childTree;
for(int i=0; snapTree!=null && i < snapTree.length; i++)
{
node = snapTree[i];
System.out.println("Snapshot name: " + node.getName());
JOptionPane.showMessageDialog(null, "Snapshot name: " + node.getName());
childTree = node.getChildSnapshotList();
if(childTree != null)
{
printSnapshots(childTree);
}
}//end of for
so instead of JOptionPane I have only onew window with the list of names and can reuse later.

A general tactic for building something recursively is to use a Collecting Parameter.
This can be applied in your case by:
static List<String> listSnapshotNames(VirtualMachineSnapshotTree[] snapTree) {
ArrayList<String> result = new ArrayList<String>();
collectSnapshots(snapTree, result);
return result;
}
static void collectSnapshots(VirtualMachineSnapshotTree[] snapTree, List<String> names)
{
VirtualMachineSnapshotTree node;
VirtualMachineSnapshotTree[] childTree;
for(int i=0; snapTree!=null && i < snapTree.length; i++)
{
node = snapTree[i];
names.add(node.getName());
childTree = node.getChildSnapshotList();
if(childTree != null)
{
collectSnapshots(childTree, names);
}
}//end of for
}
Of course, if you really want it in an array, you can convert it afterwards:
static String[] getSnapshotNames(VirtualMachineSnapshotTree[] snapTree) {
List<String> result = listSnapshotNames(snapTree);
return result.toArray(new String[0]);
}
With an unknown size, arrays are painful, so a List works better for this.

Related

How to display and add tasks to file according to priorities using Java

I need to display/list the contents of a txt file in the ascending order of priority. So, should I need to take a seperate input for priority of task or can I splice the input line?
private static void show() {
String[] items = getData("task.txt");
if (items.length == 0) {
System.out.println("There are no pending tasks!");
} else {
for (int i = items.length - 1; i >=0; i--) {
System.out.printf("[%d] %s\n", i + 1, items[i]);
}
}
My getData looks like this:
private static String[] getData(String file) {
ArrayList<String> dataList = new ArrayList<>();
Scanner s=null;
try {
s = new Scanner(new FileReader(file));
while (s.hasNextLine()){
dataList.add(s.nextLine());
}s.close();
} catch (Exception e) {
System.out.println("Problem to open \"task.txt\".");
} finally {
if (s != null) {
try {
s.close();
} catch (Exception e) {
}
}
}
String[] items = new String[dataList.size()];
for (int i = 0; i < items.length; i++) {
items[i] = dataList.get(i);
}
return items;
}
Input:
10 the thing i need to do
5 water the plants
11 clean house
Output: 5 water the plants
10 the thing i need to do
11 clean house
You can just sort the ArrayList datalist:
(I am assuming that the "priority item" format is already in it)
dataList.sort((o1, o2) -> {
Integer priority1 = Integer.parseInt(o1.split(" ")[0]);
Integer priority2 = Integer.parseInt(o2.split(" ")[0]);
return priority1.compareTo(priority2);
});
Put this right after the try-catch-finally-block.

null pointer exception when accessing array with null reference [duplicate]

This question already has answers here:
What is a NullPointerException, and how do I fix it?
(12 answers)
Closed 2 years ago.
my method is supposed to compare a cat's name from the entire cat array.
This is because my array will have nulls between created objects.
for example [0(cat 0), 1(cat 1), 2(cat 2), 3( empty null), 4(cat 4), 5(cat 5)]
I think the reason I am getting a null pointer exception is because I try to return a null and compare it to the param (String catName).
How could I avoid this while still searching the entire array?
/**
* #param catName to search for cat name
*/
public void searchCatByName(String catName) {
if (cats[0] != null) {
if(catName != null) {
int index = 0;
while (index < cats.length) {
if(cats[index].getName() != catName) {
if(index == cats.length - 1) {
System.out.println(catName + " was not found in the cattery.");
break;
}
index++;
}
else {
System.out.println(cats[index].getName() + " is in cage " + index);
break;
}
}
}
}
}
Check if the value is equal to null. If it is not equal to null then do your condition. I made an example in the code below
String arr[] = new String[]{"tom","blake",null,"jerry"};
String fider = "jerry";
for (int i = 0; i < arr.length; i++)
{
if (arr[i] != null)
if (arr[i].equals(fider))
System.out.println(i); // Prints 3
}
You have to check if the array element is null before comparing names with String equals method so instead of :
if(cats[index].getName() != catName) { /* logic */ }
the right condition is:
Cat cat = cats[index];
if(cat != null && !cat.getsName().equals(catName)) { /* logic */ }
Use simple logic. First check the array element if null, then if not null compare the cat name. Here is an example on how you should do a null check and compare strings.
public class Cat {
public static void main(String[] args) {
String catName = "Cat3";
String[] cats = new String[] {"Cat1","Cat2","Cat3", "", "Cat4"};
searchCatByName(catName, cats);
}
public static void searchCatByName(String catName, String[]cats) {
int catCounter = 0;
for(int i=0;i<cats.length;i++){
if (cats[i] != null){
if(catName.equals(cats[i])){
System.out.println(catName + " is in cage no " + (i+1));
catCounter++;
}
}
}
if(catCounter == 0){
System.out.println(catName + " was not found in the cattery.");
}
}
}

How do I make this JOptionPane load this large arrayList vertically with a JScrollBar

How do I make this JOptionPane List up to 100 items with a JScrollBar, I know it can be done. I'm asking for a little bit of guidance.
Here's my code
public static ArrayList<String> Matches = new ArrayList<String>();
private void itemSearch(String name) {
try{
String string;
BufferedReader reader = new BufferedReader(new FileReader("items.txt"));
while((string = reader.readLine()) != null) {
String[] args = string.split(" ");
for(int i = 0; i <= 19461; i++) {
if(args[i].contains(name)) {
itemID = Integer.parseInt(args[i-1]);
itemSearched = name;
Matches.add("Name: "+name+", ID: "+itemID+"");
System.out.println("Item name:"+args[i]+" Item ID:"+itemID+"");
}
}
if(Matches.size()<=1) {
continue;
} else {
JOptionPane.showMessageDialog(null, Matches);
}
AMItemDatabaseLabel3.setText(""+itemID+"");
}
} catch(Exception r) {
r.printStackTrace();
}
}
Check out the section from the Swing tutorial on Getting Users Input.
If the number of "possibilities" is greater than 20, then a JList will be used to display the values.
So you need to use an Array (not an ArrayList) containing your items. So based on your current code you would need to copy the items from the ArrayList to the Array.

Replace ArrayList Values with new String Values

i have a arraylist called arrstatus which has a set of Numeric values stored dynamically.
I have to Replace those Numeric Values with Unique String values.
I tried various methods it doesnt seem to be working
i tries Set method, didnt work,
// int[] flags = new int[arrstatus_old.size()];
int [] c = new int [arrtaskid.size()];
Toast.makeText(MyTask.this, "C:"+c, Toast.LENGTH_LONG).show();
for(int j=1;j<= c.length;j++)
{
if(arrstatus.get(j).equals("1"))
{
arrstatus_old.set(j, "Saved");
}
else if(arrstatus.get(j).equals("2"))
{
arrstatus_old.set(j, "Assigned");
}
else if(arrstatus.get(j).equals("3"))
{
arrstatus_old.set(j, "Accepted");
}
else if(arrstatus.get(j).equals("4"))
{
arrstatus_old.set(j, "Rejected");
}
}
I am not getting the size of the arrastutus, it says 0
and hence no values are getting replaced,
any better idea to replace the value.?
Your ArrayList in which 1 i.e. numbers are stored should store numbers in String format.
Your arrayList should be like ArrayList<String>
ArrayList<String> arrstatus = new ArrayList<String>();
arrstatus.add("1");
arrstatus.add("2");
arrstatus.add("3");
As you are checking in arraylist using equals you'll have add numbers as a String.
if (arrstatus.get(i).equals("1")) {
arrstatus.set(i, "Saved");
}if (arrstatus.get(i).equals("2")) {
arrstatus.set(i, "Assigned");
}if (arrstatus.get(i).equals("3")) {
arrstatus.set(i, "Accepted");
}
and so on...
ArrayList<String> arrstatus = new ArrayList<String>();
arrstatus.add("1");
arrstatus.add("2");
arrstatus.add("3");
arrstatus.add("4");
for(int j=0;j< c.length;j++)
{
if(arrstatus.get(j).equals("1"))
{
arrstatus_old.set(j, "Saved");
}
else if(arrstatus.get(j).equals("2"))
{
arrstatus_old.set(j, "Assigned");
}
else if(arrstatus.get(j).equals("3"))
{
arrstatus_old.set(j, "Accepted");
}
else if(arrstatus.get(j).equals("4"))
{
arrstatus_old.set(j, "Rejected");
}
}

Logic of deleting in Java

I cant figure out how to start a method to delete a specific entry stored in an array...
I used to do this:
public void deleteEntry() {
SName = JOptionPane.showInputDialog("Enter Name to delete: ");
for (int i = 0; i < counter; i++) {
if (entry[i].getName().equals(SName)) {
JOptionPane.showMessageDialog(null, "Found!");
entry[i] = null;
}
}
}
but I was advised not to assign the entry[i] to null because it will ruin my entries...
I have no idea how to code it in another way...
What should I need to do is:
I need to delete a specific entry from an array
please help...
also... its output was error it says:
Exception in thread "main" java.lang.NullPointerException
at AddressBook.viewAll(AddressBook.java:62)
at AddressBook.main(AddressBook.java:36)
Java Result: 1
This is my code in my main program:
public class AddressBook {
private AddressBookEntry entry[];
private int counter;
private String SName;
public static void main(String[] args) {
AddressBook a = new AddressBook();
a.entry = new AddressBookEntry[100];
int option = 0;
while (option != 5) {
String content = "Choose an Option\n\n"
+ "[1] Add an Entry\n"
+ "[2] Delete an Entry\n"
+ "[3] Update an Entry\n"
+ "[4] View all Entries\n"
+ "[5] View Specific Entry\n"
+ "[6] Exit";
option = Integer.parseInt(JOptionPane.showInputDialog(content));
switch (option) {
case 1:
a.addEntry();
break;
case 2:
a.deleteEntry();
break;
case 3:
a.editEntry();
break;
case 4:
a.viewAll();
break;
case 5:
a.searchEntry();
break;
case 6:
System.exit(1);
break;
default:
JOptionPane.showMessageDialog(null, "Invalid Choice!");
}
}
}
public void addEntry() {
entry[counter] = new AddressBookEntry();
entry[counter].setName(JOptionPane.showInputDialog("Enter name: "));
entry[counter].setAdd(JOptionPane.showInputDialog("Enter add: "));
entry[counter].setPhoneNo(JOptionPane.showInputDialog("Enter Phone No.: "));
entry[counter].setEmail(JOptionPane.showInputDialog("Enter E-mail: "));
counter++;
}
public void viewAll() {
String addText = " NAME\tADDRESS\tPHONE NO.\tE-MAIL ADD\n\n";
for (int i = 0; i < counter; i++) {
addText = addText + entry[i].getInfo() + "\n";
}
JOptionPane.showMessageDialog(null, new JTextArea(addText));
}
public void searchEntry() {
int notfound = 0;
SName = JOptionPane.showInputDialog("Enter Name to find: ");
for (int i = 0; i < counter; i++) {
if (entry[i].getName().equals(SName)) {
JOptionPane.showMessageDialog(null, entry[i].getInfo2());
break;
} else {
notfound++;
}
}
if (notfound != 0) {
JOptionPane.showMessageDialog(null, "Name Not Found!");
}
notfound = 0;
}
public void editEntry() {
int notfound = 0;
SName = JOptionPane.showInputDialog("Enter Name to edit: ");
for (int i = 0; i < counter; i++) {
if (entry[i].getName().equals(SName)) {
entry[i] = new AddressBookEntry();
entry[i].setName(JOptionPane.showInputDialog("Enter new name: "));
entry[i].setAdd(JOptionPane.showInputDialog("Enter new add: "));
entry[i].setPhoneNo(JOptionPane.showInputDialog("Enter new Phone No.: "));
entry[i].setEmail(JOptionPane.showInputDialog("Enter new E-mail: "));
break;
} else {
notfound++;
}
}
if (notfound != 0) {
JOptionPane.showMessageDialog(null, "Name Not Found!");
}
notfound = 0;
}
public void deleteEntry() {
SName = JOptionPane.showInputDialog("Enter Name to delete: ");
for (int i = 0; i < counter; i++) {
if (entry[i].getName().equals(SName)) {
JOptionPane.showMessageDialog(null, "Found!");
entry[i] = null;
break;
}
}
}
}
Assigning the values to null is going to be the easiest practice. If you're really picky, you could resize the array, but that would be rather pointless. Just keep a separate size counter and decrement it each time you set something to null.
Another reason you're getting a null pointer exception is that you have to consider what's happening when you're replacing values in your array with null but still iterating by counter. You're going to be left with holes in your array upon deletion. The first solution would be to bypass null values altogether, and just shift your array down (somewhat of an expensive operation). The second would be to alter your methods to take those null values into consideration. Example:
public void viewAll() {
String addText = " NAME\tADDRESS\tPHONE NO.\tE-MAIL ADD\n\n";
int nonNull = 0;
for (int i = 0; i < entry.length; i++) {
if (entry[i] != null) {
addText = addText + entry[i].getInfo() + "\n";
nonNull++;
}
if (nonNull == counter) break;
}
JOptionPane.showMessageDialog(null, new JTextArea(addText));
}
I don't have a compiler on this computer, so consider it more of psuedo-code. But the idea is that the counter is only keeping track of how many non-null values you have in your address book, and that these null values could be in random places of your array. I added the nonNull integer as a local counter to keep track of how many values you've encountered that aren't null (so you aren't forced to run through the entire address book). Then, I added the if statement to ensure that the value at entry[i] isn't a null value (trying to invoke getInfo() on a null value is what's giving you that error). Lastly, I added the if statement to break the loop if you've encountered all of the non-null values you have stored. Hope this helps. (Also it may be worth considering a LinkedList to eliminate the null values all together).
Actually, for simplicity's sake, you probably are much better off using a LinkedList, unless you are required to use an array, since you would need to alter all of your methods to take null spaces in your array into account. Assuming you're familiar with LinkedLists of course.
Arrays are immutable. You can change the value for a particular index in the array but you can't change the array size itself. To "delete", you could do:
myArray[index] = null;
And just treat null values as unset/deleted entries.
Assigning to null (currently what you are doing) is the proper thing to do. That will eliminate the reference to the object at that index and allow it to be garbage collected.
Replace entry[i] = null; with this:
System.arraycopy(entry, i + 1, entry, i, counter - i - 1);
--counter;
entry[counter] = null; // optional; helps with garbage collection
--i; // required to not skip the next element
(I'm assuming here that counter is the number of valid entries in entry. This will leave no null entries among the first counter elements of entry (assuming that there weren't any to start with).
Further thought: If you need the array length to always match the number of valid entries, you'll have to re-allocate the array and copy the values over. Just use arraycopy to copy entries from 0 through i-1 and from i+1 to counter-1 into the new array and then assign it to entry. This isn't particularly efficient and is best avoided if possible.
Better to this is List which has remove() method. But if you really want use Array I recommend you change Array to List and then remove all values, after it you can always change List to Array
import javax.swing.JOptionPane;
public class Test {
private static User[] entry = new User[] { new User("Gil"),
new User("Bil"), new User("John") };
public static void main(String... args) {
final Test test = new Test();
test.deleteEntry();
for (int index = 0; index < entry.length; index++) {
User user = entry[index];
if (user != null)
System.out.println(entry[index]);
}
}
public void deleteEntry() {
String SName = JOptionPane.showInputDialog("Enter Name to delete: ");
for (int index = 0; index < entry.length; index++) {
if (entry[index].getName().equals(SName)) {
JOptionPane.showMessageDialog(null, "Found!");
entry[index] = null;
break;
}
}
}
private static class User {
private String name;
public User(String name) {
this.name = name;
}
/**
* #return the name
*/
public String getName() {
return name;
}
#Override
public String toString() {
return name;
}
}
}

Categories