Return a two array confusion matrix - java

I'm trying to create a confusion matrix however I'm not sure how to properly return my method where I can index both predicted and actual values, here's what I have tried thus far:
int[][] matrixConfusion(int[] predicted, int[] actual){
int[] count = new int [10];
int counts = 0;
int counts1 = 0;
int counts2 = 0;
int counts3 = 0;
for(int i = 0; i < count.length; i++) {
if(actual[i] == count[i] && predicted[i] == count[i]) {
counts++;
}else if(actual[i] != count[i] && predicted[i] != count[i]) {
counts1++;
}else if(actual[i] != count[i] && predicted[i] == count[i]) {
counts2++;
}else if(actual[i] == count[i] && predicted[i] != count[i]) {
counts3++;
}
}
System.out.println("\t"+ "Actual = 0:"+"\t"+"Actual = 1:"+"\n" + "Predic = 0:" + "\t" + counts + "\t" + counts2 + "\n" + "Predic = 1:" + "\t" + counts3 + "\t" + counts1);
return null;
}
The code works by printing out the statements above however, I cannot find a way to properly return the values from print,so that I can return the values rather than print them.

Related

What is the time complexity of this algorithm(code)?

I have algorithm that translate six types of XPath queries into SQL queries. so, my code contains If-elseif-else statement (multiple if). I read from the internet that the time complexity of the If-elseif-else statement is the worst-case time of one one of the if that has more processing. I need to know what is is the time complexity for this code:
} else if (Query_Type == 5){
for (int i = strXPathQuery.length()-1; i > 0; i--) {
if (strXPathQuery.charAt(i) == '/') {
position = i;
break;
}
} // end for loop
Last_Node = strXPathQuery.substring(position+1);
strAncestor_Path = "";
int bracket_pos=0;
for (int i = 0; i < position; i++) {
if (strXPathQuery.charAt(i) == '[') {
bracket_pos = i;
break;
} else if (strXPathQuery.charAt(i) == '/' && strXPathQuery.charAt(i+1) == '/') {
strAncestor_Path = strAncestor_Path + "%";
}
else {
strAncestor_Path = strAncestor_Path + strXPathQuery.charAt(i);
} // end if statement
} // end for
int operator_pos = 0;
String Node_condition="";
for (int i = bracket_pos+1; i < position-2; i++) {
if ((strXPathQuery.charAt(i) == '<') || (strXPathQuery.charAt(i) == '>') || (strXPathQuery.charAt(i) == '=') || (strXPathQuery.charAt(i) == '!')) {
operator_pos = i;
break;
}
else {
Node_condition = Node_condition + strXPathQuery.charAt(i);
} // end if }
String Value_condition="";
for (int i = operator_pos; i < position-1; i++) {
Value_condition = Value_condition + strXPathQuery.charAt(i);
} // end for loop
strSQLQuery = "SELECT L2.Node_Value \n" +
"FROM Leaf_Node L1, Leaf_Node L2, Ancestor_Path P\n" +
"WHERE P.Ances_PathExp LIKE '" + strAncestor_Path + "'\n" +
"AND L1.Ances_PathID = P.Ances_PathID \n" +
"AND L1.Node_Name = '" + Node_condition + "'\n" +
"AND L1.Node_Value '".replace("'", "") + Value_condition + "'\n".replace("'", "") +
"AND L2.Node_Name = '" + Last_Node + "'\n" +
"AND L1.Ances_PathID = L2.Ances_PathID \n" +
"AND L1.Ances_Pos = L2.Ances_Pos " ;
txtSQLQuery.setText(strSQLQuery);
}
}
You have three looks there that could be O(N^2). For example.
for (int i = 0; i < position; i++) {
...
strAncestor_Path = strAncestor_Path + strXPathQuery.charAt(i);
...
}
Assume (worst case) that for that loop, the value of position is strXPathQuery.length() ... or N. That means that you are appending a character to the same string N times. Since appending a character to a string is an O(N) operation. (The append is creating a new string, copying all characters in the existing string.) The complexity of doing that N times is O(N^2).
The average complexity could be better than that, but it will depend on the input.
(And I don't have the patience to get my head around what you are actually trying to here. The your code's crap style is making my eyes hurt.)
If you want to perform the performance, don't build strings like that. Use a StringBuilder.
StringBuilder path = new StringBuilder();
for (int i = 0; i < position; i++) {
...
path.append(strXPathQuery.charAt(i));
...
}

Getting out of bounds error

so I'm testing out this piece of code, and when I read a file, the output when being printed halts and I get java.lang.ArrayIndexOutOfBoundsException: -1
at WordLengths.countWordLengthsWithIsLettermethod(WordLengths.java:126)
at WordLengths.testWordLengths(WordLengths.java:152).
I'm wondering if somewhere I inadvertently added a limit to how many results I get, otherwise I can't think of what could be wrong.
This is the bit that's causing trouble (max = freqs[i];):
public int maxIndex(int[] freqs) {
int max = freqs[0];
for (int i = 1; i < freqs.length; i++) {
if (freqs[i] > max) {
max = freqs[i];
}
}
System.out.println("max number of words of certain lengths: "+max);
return freqs[max];
//return max;
}
Here's the whole code with the problem area included:
import edu.duke.FileResource;
public class WordLengths {
public void countWordLengths(FileResource resource, int[] counts) {
String abc = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
for (String word : resource.words()) {
String trim = word.trim();
int wordSize = trim.length();
//System.out.println("word" + "\t" + trim);
int lastInd = trim.length()-1;
//System.out.println("lastIndexOf word" + "\t" + lastInd);
//abc.contains(trim.charAt(lastInd));
char firstChar = trim.charAt(0);
char endChar = trim.charAt(trim.length()-1);
//System.out.println("firstChar" + "\t" + firstChar + "\t" + "endChar" + "\t" + endChar);
int idx = abc.indexOf(firstChar);
int idx_e = abc.indexOf(endChar);
int edx_sum = idx + idx_e;
//System.out.println("indexes abc" + "\t" + edx_sum);
//int idx_s = small.indexOf(firstChar);
//int idx_s_e = small.indexOf(endChar);
//int edx_s_sum = idx_s + idx_s_e;
//System.out.println("indexes small" + "\t" + edx_s_sum);
//System.out.println("indexes" + "\t" + idx + "\t" + idx_e + "\t" + idx_s + "\t" + idx_s_e);
//System.out.println("indexes" + "\t" + idx + "\t" + idx_e + "\t");
if (idx == -1 && idx_e == -1) {
wordSize -= 2;
} else
if (idx == -1 || idx_e == -1) {
wordSize -= 1;
}
if(wordSize>=counts.length) {
counts[counts.length-1] += 1;
} else
//right algorithm
if( counts[wordSize] != 0) {
counts[wordSize] += 1;
} else {
counts[wordSize] = 1;
}
}
//test
/*for(int i : counts) {
System.out.println(i);
}*/
}
/**
* the method countWordLengths(FileResource resource, int[] counts) with isLetter method
*
* #param resource
* #param counts
*/
public void countWordLengthsWithIsLettermethod(FileResource resource, int[] counts) {
for (String word : resource.words()) {
String trim = word.trim();
int wordSize = trim.length();
char firstChar = trim.charAt(0);
char endChar = trim.charAt(trim.length()-1);
if (!Character.isLetter(firstChar) && !Character.isLetter(endChar)) {
wordSize -= 2;
} else
if (!Character.isLetter(firstChar) || !Character.isLetter(endChar)) {
wordSize -= 1;
}
if(wordSize>=counts.length) {
counts[counts.length-1] += 1;
} else
//right algorithm
if( wordSize> 0 && counts[wordSize] != 0 ) {
counts[wordSize] += 1;
} else if ( wordSize> 0) {
counts[wordSize] = 1;
}
System.out.println(counts[wordSize] + " words with length " + wordSize + ": " + word);
}
//test
/*for(int i : counts) {
System.out.println(i);
}*/
}
public int maxIndex(int[] freqs) {
int max = freqs[0];
for (int i = 1; i < freqs.length; i++) {
if (freqs[i] > max) {
max = freqs[i];
}
}
System.out.println("max number of words of certain lengths: "+max);
return freqs[max];
//return max;
}
public void testWordLengths() {
WordLengths wl = new WordLengths();
FileResource fr = new FileResource();
int counts[] = new int[100];
//wl.countWordLengths(fr, counts);
wl.countWordLengthsWithIsLettermethod(fr, counts);
wl.maxIndex(counts);
}
}
What do think would happen if the word was empty (or just filled with blanks)
String trim = word.trim();
int wordSize = trim.length();
char firstChar = trim.charAt(0);
char endChar = trim.charAt(trim.length()-1);

How to insert a "," in between each char of a string

Im at a point in my program where I need to set marks in a string before I pass it through another method, I have it so that every 4th char will have a "|" inserted, this is to mark a row break. Not I want to take each char in between the outter marks "|" and put a ",". that two char array method wont work here otherwise I would have tryed to use that but I'm not looking for a char array.
public static String matrixFormatter(String x){
x = x.substring(0, 4) + "|" + x.substring(4, x.length());
return x;
}
this works so far, now I want to add a "," between each char, I thought the code below would work and this would be easy but I was wrong.
public static String matrixFormatter(String x){
for(int i = 0; i<=x.length(); i+=4){
for(int j = 0; j<=x.length(); i++){
x = x.substring(0, i) + "|" + x.substring(i, x.length());
x = x.substring(0, j) + "|" + x.substring(j, x.length());
}
}
return x;
}
The code below adds a "," between characters in the string.
public static String matrixFormatter(String x){
String result;
for(int i = 0; i<x.length()-1; i++){
result += x.substring(i, i+1) + ",";
}
return result+",";
}
try this regex
s = s.replaceAll("(?<=.)(?=.)", ",");
It can be done with StringBuffer and also with Joiner of Guava library:
public static void main(String[] args) {
String s = "example";
System.out.println(withBuilder(s));
System.out.println(withJoiner(s));
}
private static String withJoiner(String s) {
return Joiner.on(",").join(Chars.asList(s.toCharArray()));
}
private static String withBuilder(String s)
{
StringBuilder builder = new StringBuilder(s);
int index = 1;
for (int i = 0; i < s.length() ; i++)
{
builder.insert(index, ",");
index +=2;
}
return builder.toString();
}
Output is:
e,x,a,m,p,l,e,
e,x,a,m,p,l,e
It can be done in one method:
public static String matrixFormatter(String x) {
List<String> chars = Arrays.asList(x.split(""));
String result = chars.get(0);
for (int i = 1; i < chars.size(); i++) {
if (i % 4 == 0)
result += "|" + chars.get(i);
else
result += "," + chars.get(i);
}
return result;
}
calling with:
System.out.println(matrixFormatter("12345678"));
outputs:
1,2,3,4|5,6,7,8
public static String matrixFormatter(String x) {
resultstr = "";
int i = 0;
while(i < x.length()) {
// If end of string: only add character.
if (i == x.length() - 1) {
resultstr += x.substring(i, i + 1);
} else {
if ( ((i + 1) % 4) == 0) {
resultstr += x.substring(i, i + 1) + "|";
} else {
resultstr += x.substring(i, i + 1) + ",";
}
}
i++;
}
return resultstr;
}
Haven't got Java installed but tested the concept via PHP-code:
function matrixFormatter($x) {
$resultstr = "";
$i = 0;
while($i < strlen($x)) {
if ($i == strlen($x) - 1) {
$resultstr .= $x[$i];
} else {
if ( (($i + 1) % 4) == 0) {
$resultstr .= $x[$i] . "|";
} else {
$resultstr .= $x[$i] . ",";
}
}
$i++;
}
return $resultstr;
}
matrixFormatter("abcdefghijklmnopq") returns "a,b,c,d|e,f,g,h|i,j,k,l|m,n,o,p|q".
I'm not sure I understand you question correctly, you should probably add some input and expected output to be more clearer.
String a = "abcdefghijklmnop";
String a2 = "";
for (int i = 0; i < a.length(); i++) {
if (i != 0) {
if(i % 4 == 0){
a2 += "|";
} else{
a2 += ",";
}
}
a2 += a.charAt(i);
}
System.out.println(a2);
This will produce the output a,b,c,d|e,f,g,h|i,j,k,l|m,n,o,p

Insert semicolon between items from an array except the last

Based from the accepted answer from this post, I have this code:
if (authors.length >= 1) {
System.out.print(authors[0]);
}
for (int i = 1; i < authors.length; i++) {
System.out.print("; " + authors[i]);
}
So the output of this is author1; author2; author3
How can I change this into author1; author2 & author3? If there are only 2 authors, the output should be author1 & author2. Thanks in advance.
You'd just need to add in one conditional to your loop to handle the last case:
for (int i = 1; i < authors.length; i++) {
if(i == authors.length - 1)
System.out.print("& " + authors[i]);
else
System.out.print("; " + authors[i]);
}
One way to do it would be changing the structure of the code to use a loop and a boolean flag instead of a conditional, like this:
boolean isFirst = true;
for (int i = 0 ; i != authors.length ; i++) {
if (!isFirst) {
System.out.print(i == authors.length-1 ? "& " : "; ");
} else {
isFirst = false;
}
System.out.print(authors[i]);
}
Demo.
You can do it recursively to separate cases clearly. Seems like other answers lack that.
This is the proxy function:
public static String doIt(String[] authors){
if (authors == null || authors.length == 0){
return "";
}
if (authors.length == 1){
return authors[0];
}
return authors[0] + doHelper(authors, 1);
}
And the helper function:
public static String doItHelper(String[] authors, int index){
if (index == authors.length - 1){
return " & " + authors[index];
}
return "; " + authors[index] + doItHelper(authors, index + 1);
}
As mentioned in comments (Thanks #JNYRanger) this is not optimal when performance is an issue.
Can't test it now, so I hope the idea is clear.
Try it this way:
String[] authors = { "1", "2", "3", "4", "5" };
StringBuffer sb = new StringBuffer();
for (int i = 0; i < authors.length; i++) {
sb.append(authors[i]);
if (i + 2 < authors.length) {
sb.append(";");
} else if (i + 2 == authors.length) {
sb.append("&");
}
}
System.out.print(sb.toString());
for (int i = 0; i < authors.length; i += 1) {
if (i > 0) {
System.out.print(i < authors.length - 1 ? "; " : " & ");
}
System.out.print(authors[i]);
}
String[] authors = {"a", "b", "c", "d"};
for (int i = 0; i < authors.length; i++) {
System.out.print((i != 0 ? (i == authors.length - 1 ? " & " : "; ") : "") + authors[i]);
}

Printing a polynomial

I am trying to print a polynomial from a given number.
I did the example below, but for something like 100 it will print 1x^2+, when I want just x^2. What I'm looking for is how can I make it to not print + and at the same time get rid of coefficients that are 1.
Edit: I did it, it prints perfectly. Feel free to use it.
private static String S_frumos(int poli) {
String s = "";
for (int i = 0; i < String.valueOf(poli).length(); i++) {
int nr = Character.getNumericValue(S_GetCoefs(poli, i));
if (nr != 0) {
if (i == String.valueOf(poli).length() - 1) {
s = s + nr;
} else if (i == String.valueOf(poli).length() - 2) {
if ((S_zero(poli, i + 1) == 1)) {
if (nr != 1) {
s = s + nr + "x";
} else {
s = s + "x";
}
} else {
if (nr != 1) {
s = s + nr + "x" + "+";
} else {
s = s + "x" + "+";
}
}
} else if ((S_zero(poli, i + 1) == 1)) {
if (nr != 1) { s = s + nr + "x^" + (String.valueOf(poli).length() - i - 1);}
else { s = s + "x^" + (String.valueOf(poli).length() - i - 1);}
} else {
if (nr != 1){ s = s + nr + "x^" + (String.valueOf(poli).length() - i - 1) + "+";}
else { s = s + "x^" + (String.valueOf(poli).length() - i - 1) + "+";}
}
}
}
return s;
}
private static int S_GetCoefs(int poli, int x) {
return String.valueOf(java.lang.Math.abs(poli)).charAt(x);
}
To store something of an unknown length... then you can still use an int/double array, just gets slightly more complicated.
public static void main(String[] args)
{
// Say the size is given in a command line argument.
int coefficientNumber = Integer.parseInt(args[0]);
int[] poly = new int[coefficientNumber];
for (int i = 0; i < poly.length; i++)
{
poly[i] = 0;
}
// Set the highest coeffient to 1 (if there is 3 coefficients, this is coefficient
// of x^2, if 4 coefficients, this is coefficient of x^3
poly[0] = 1;
printPoly(poly);
}
// To print a polynomial of unknown length.
// If the coefficient is 0, don't print it.
private static void printPoly(int[] poly)
{
String output = "";
for (int index = 0; index < poly.length; index++)
{
if (poly[index] != 0)
{
// If this is the first coefficient with a value
if (output.length() == 0)
output = poly[index] + "x^" + (poly.length - (index + 1));
// Else if there is already some coefficient with values printed.
else
output += " + " + "x^" + (poly.length - (index + 1));
} // if
} // for
System.out.println(output);
} // printPoly
First of all, storing a polynomial in one variable isn't a great idea as if you have coefficients of more than 9 you'll get confused.
A better method imo (without making a polynomial class) is to store the polynomial in an int/double array.
public static void main(String[] args)
{
// To store the polynomial x^2, you could do the following:
int[] poly = new int[3];
poly[0] = 1;
poly[1] = 0;
poly[2] = 0;
printPoly(poly);
}
// To print it:
private static void printPoly(int[] poly)
{
String output = "";
if (poly[0] != 0)
output += poly[0] + "x^2"
if (poly[1] != 0)
{
if (output.size() > 0)
output += " + " + poly[1] + "^x";
else
output += poly[1] + "x";
}
if (poly[2] != 0)
{
if (output.size() > 0)
output += " + " + poly[2];
else
output += poly[2];
}
}

Categories

Resources