How to delete a word from the csv file - java
How to delete a word from the csv file when it is used so as not to have the same question twice with the same word and stop when all the words have been used?
import extensions.CSVFile;
CSVFile wordPrice = loadCSV("wordPrice");
class Word {
String word;
int price;
}
void play (Word info) {
int RightPrice = info.price;
int Price;
println("What is the price of a" + info.word);
do{
counter = counter + 1;
Price = readInt();
if (Price<RightPrice){
println("It's +");
}
else if (Price>RightPrice) {
println("It's -");
}
}
Word randWord(){
Word mp = new Word();
int line = (int)(random() * rowCount(wordPrice));
mp.word = getCell(wordPrice, line, 0);
String price = getCell(wordPrice, line, 1);
mp.price = stringToInt(price);
return mp;
}
boolean replay(boolean exit) {
println("Do you wan to play again (Y : Yes, N : No) ?");
char answer = readChar();
if(answer == 'N') {
exit = true;
}
if(answer == 'Y') {
exit = false;
}
return exit;
}
void algorithm(){;
println("Find the price of items to win !");
boolean exxite = false;
while(exxite == false) {
Word randWord = randWord();
play(randWord);
exxite = replay(exxite);
}
}
csv name: wordPrice.
There are two columns, one with the words and the other with the prices.
You can try for that HashMap with key as a word and value as a price. Then just use this data structure in your algorithm.
So it could be something like that:
// CSV to map
Map<String, String> wordAndPrice = new HashMap<>();
try (BufferedReader br = new BufferedReader(new FileReader("wordPrice.csv"))) {
String currentLine;
while ((currentLine = br.readLine()) != null) {
String[] values = currentLine.split(",");
wordAndPrice.put(values[0], values[1]);
}
};
// remove unused words from map (use Iterator because you can get ConcurrentModification exception)
Iterator<Entry<String, String>> iterator = wordAndPrice.entrySet().iterator();
while (iterator.hasNext()) {
if (iterator.next().getKey().equals("Your word"))
iterator.remove();
}
As you pointed tag OpenCSV, you can use it to load csv file instead of BufferedReader:
CSVReader csvReader = new CSVReader(new FileReader("wordPrice.csv"));
Related
NoSuchElement Exception in Thread in TextFile Program
Hi. I'm having the issue in an error of exception. I don't know what is wrong. But please help me fix this. I'm trying to store data from the file to ArrayList and display the data in the ArrayList. Here, I attached my code and data Code and data source.
the NoSuchElementException appears because you are calling input.nextToken(); while input doesn't have any token.It's due to the last empty line of your file listbook.txt. By deleting this line, the exception shouldn't appear. A proper manner could be to ensure that you have sufficient tokens to retrieve all your fields for a given line. public class TextFile { public static void main(String[] args) { try { FileReader read = new FileReader("C:\\Users\\ogawi\\Downloads\\listbook.txt"); BufferedReader bf = new BufferedReader(read); Book B = new Book(); ArrayList<Book> bookList = new ArrayList<Book>(); String data = null; StringTokenizer input = null; while((data = bf.readLine()) != null) { input = new StringTokenizer(data,";"); //we ensure that we have enough tokens to retrieve all fields if(input.countTokens() == 6) { String title = input.nextToken(); String author = input.nextToken(); String publisher = input.nextToken(); String genre = input.nextToken(); int year = Integer.parseInt(input.nextToken()); int page = Integer.parseInt(input.nextToken()); B = new Book(title, author, publisher, genre, year, page); bookList.add(B); } } //This part of code has been moved outside the while loop //to avoid to print the total content of the array each time //an element is added int count=0; for(int i=0;i<bookList.size();i++) { B = (Book)bookList.get(i); System.out.println(B.toString()); System.out.println("============================="); count++; } System.out.println("Number of Books: " + count); bf.close(); } catch(FileNotFoundException fnf) { System.out.println(fnf.getMessage());} catch(EOFException eof) { System.out.println(eof.getMessage());} catch(IOException io) { System.out.println(io.getMessage());} finally { System.out.println("System end here..TQ!!");} } }
This issue is due to the extra line without book information: You can see the line 31 and 32 in above figure. To solve this issue you can add one if condition data.contains(";") . Text file has ; delimiter if we check the condition if given line has ; delimiter then it won't cause an issue. while ((data = bf.readLine()) != null) { if (data.contains(";")) { input = new StringTokenizer(data, ";"); String title = input.nextToken(); String author = input.nextToken(); String publisher = input.nextToken(); String genre = input.nextToken(); int year = Integer.parseInt(input.nextToken()); int page = Integer.parseInt(input.nextToken()); B = new Book(title, author, publisher, genre, year, page); bookList.add(B); int count = 0; for (int i = 0; i < bookList.size(); i++) { B = (Book) bookList.get(i); System.out.println(B.toString()); System.out.println("============================="); count++; } System.out.println("Number of Books: " + count); } } Here is the screenshot for successful execution of the code.
HashMap key that is made up of multiple tokens and has non-null value mapping returns null
I am creating a currency exchange application from csv data and have hit a road block. I am storing the main currency exchange rate table in a LinkedHashMap of the following type: LinkedHashMap[String,LinkedHashMap[String,Double]] It will store the data as [Country, [Year,Rate]]. When I print to the console to confirm that the Map is being populated properly, I receive confirmation of a full KeySet and proper value mappings. Additionally, the application runs smoothly for any country names consisting of only one token. However, countries with more than one token in their names return null even though the map is populated with that key and its correct corresponding value. For example, printing getExchangeRates() will return all K-V pairs including the following: Australia={1960=0.8929, 1961=0.8929, 1962=0.8929, 1963=0.8929, 1964=0.8929, 1965=0.8929...}, Czech Republic={1990=21.145, 1991=27.92, 1992=28.37, 1993=29.153, 1994=28.785, 1995=26.541...}, New Zealand={1960=0.7143, 1961=0.7155, 1962=0.7192, 1963=0.7192, 1964=0.7192, 1965=0.7192...} Printing getExchangeRates().get("Australia") will return the LinkedHashMap of years and rates; however, printing getExchangeRates().get("Czech Republic") or getExchangeRates().get("New Zealand") will return null. Does anyone know why this would be happening? I am befuddled. Code and csv snippet included for reference, but as I said, the HashMap appears to be populating correctly. ,1960,1961,1962,1963,1964,1965,1966,1967,1968,1969,1970,1971,1972,1973,1974,1975,1976,1977,1978,1979,1980,1981,1982,1983,1984,1985,1986,1987,1988,1989,1990,1991,1992,1993,1994,1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,2005,2006,2007,2008 Australia,0.8929,0.8929,0.8929,0.8929,0.8929,0.8929,0.8929,0.8929,0.8929,0.8929,0.8929,0.8827,0.8387,0.7041,0.6967,0.7639,0.8183,0.9018,0.8737,0.8946,0.8782,0.8702,0.9859,1.11,1.1395,1.4319,1.496,1.4282,1.2799,1.2646,1.2811,1.2838,1.3617,1.4706,1.3678,1.349,1.2779,1.3474,1.5918,1.55,1.7248,1.9334,1.8406,1.5419,1.3598,1.3095,1.328,1.1951,1.1922 Austria,1.88949,1.88949,1.88949,1.88949,1.88949,1.88949,1.88949,1.88949,1.88949,1.88949,1.88949,1.81394,1.67985,1.42293,1.35844,1.26573,1.30373,1.20106,1.05533,0.97145,0.94024,1.15745,1.23975,1.30544,1.45412,1.50356,1.1095,0.91877,0.89734,0.96151,0.82628,0.84852,0.79862,0.84534,0.83005,0.73265,0.76936,0.88691,0.89962,0.93863,1.0854,1.11751,1.06255,0.88603,0.80537,0.80412,0.79714,0.73064,0.68268 Belgium,1.23947,1.23947,1.23947,1.23947,1.23947,1.23947,1.23947,1.23947,1.23947,1.23947,1.23947,1.21145,1.09109,0.9662,0.96558,0.91173,0.957,0.88852,0.78067,0.72679,0.72488,0.92041,1.13264,1.26752,1.43243,1.47194,1.10739,0.92549,0.91146,0.9768,0.82841,0.84651,0.79697,0.85762,0.82936,0.73079,0.76752,0.88681,0.89982,0.93863,1.0854,1.11751,1.06255,0.88603,0.80537,0.80412,0.79714,0.73064,0.68268 Canada,0.9698,1.0131,1.0701,1.0811,1.0811,1.0811,1.0811,1.0811,1.0811,1.0811,1.0477,1.0098,0.9899,1.0001,0.978,1.0172,0.986,1.0635,1.1407,1.1714,1.1692,1.1989,1.2337,1.2324,1.2951,1.3655,1.3895,1.326,1.2307,1.184,1.1668,1.1457,1.2087,1.2901,1.3656,1.3724,1.3635,1.3846,1.4835,1.4857,1.4851,1.5488,1.5693,1.4011,1.301,1.2118,1.1344,1.0741,1.067 Czech Republic,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,21.145,27.92,28.37,29.153,28.785,26.541,27.145,31.698,32.281,34.569,38.598,38.035,32.739,28.209,25.7,23.957,22.596,20.294,17.072 Denmark,6.9071,6.9071,6.9071,6.9071,6.9071,6.9071,6.9071,6.9565,7.5,7.5,7.5,7.4169,6.9493,6.0495,6.0949,5.7462,6.045,6.0032,5.5146,5.261,5.6359,7.1234,8.3324,9.145,10.3566,10.5964,8.091,6.8403,6.7315,7.3102,6.1886,6.3965,6.0361,6.4839,6.3606,5.6024,5.7987,6.6045,6.7008,6.9762,8.0831,8.3228,7.8947,6.5877,5.9911,5.9969,5.9468,5.4437,5.0981 Finland,0.5382,0.5382,0.5382,0.5382,0.5382,0.5382,0.5382,0.58025,0.70638,0.70638,0.70638,0.70375,0.69736,0.64267,0.6347,0.61871,0.64995,0.6777,0.69249,0.65515,0.62735,0.72577,0.81074,0.93682,1.01081,1.04241,0.85263,0.73928,0.7035,0.72173,0.64307,0.68015,0.75339,0.96074,0.87853,0.73442,0.77258,0.87314,0.89881,0.93863,1.0854,1.11751,1.06255,0.88603,0.80537,0.80412,0.79714,0.73064,0.68268 France,0.75266,0.75266,0.75266,0.75266,0.75266,0.75266,0.75266,0.75266,0.75266,0.79185,0.84673,0.84496,0.769,0.67959,0.7339,0.65343,0.72855,0.74907,0.68802,0.64858,0.64419,0.8285,1.00191,1.16186,1.33227,1.36978,1.05588,0.91633,0.90812,0.97264,0.83013,0.86014,0.80704,0.86335,0.8464,0.76095,0.77986,0.8898,0.89938,0.93863,1.0854,1.11751,1.06255,0.88603,0.80537,0.80412,0.79714,0.73064,0.68268 Germany,2.14743,2.06221,2.04517,2.04517,2.04517,2.04517,2.04517,2.04517,2.04517,2.01619,1.87133,1.78481,1.63033,1.36648,1.3231,1.25793,1.28743,1.18731,1.027,0.93714,0.92936,1.15552,1.2407,1.30546,1.45511,1.50523,1.11026,0.91899,0.89795,0.96125,0.82611,0.84851,0.79846,0.84533,0.82972,0.73275,0.76938,0.88661,0.8997,0.93863,1.0854,1.11751,1.06255,0.88603,0.80537,0.80412,0.79714,0.73064,0.68268 Greece,0.08804,0.08804,0.08804,0.08804,0.08804,0.08804,0.08804,0.08804,0.08804,0.08804,0.08804,0.08804,0.08804,0.08694,0.08804,0.09406,0.10717,0.10811,0.10784,0.1087,0.12507,0.16261,0.19605,0.25844,0.33079,0.40534,0.4108,0.39745,0.41632,0.47665,0.46519,0.5349,0.55942,0.67278,0.71197,0.67986,0.70642,0.80134,0.86729,0.89698,1.07234,1.11751,1.06255,0.88603,0.80537,0.80412,0.79714,0.73064,0.68268 Hungary,..,..,..,..,..,..,..,..,60,60,60,59.82,55.26,48.97,46.75,43.97,41.58,40.96,37.91,35.58,32.53,34.31,36.63,42.67,48.04,50.12,45.83,46.97,50.41,59.07,63.21,74.74,78.99,91.93,105.16,125.68,152.65,186.79,214.4,237.15,282.18,286.49,257.89,224.31,202.75,199.58,210.39,183.63,172.11 Iceland,0.344,0.401,0.43,0.43,0.43,0.43,0.43,0.442,0.622,0.88,0.88,0.88,0.883,0.901,1,1.537,1.822,1.989,2.711,3.526,4.798,7.224,12.352,24.843,31.694,41.508,41.104,38.677,43.014,57.042,58.284,58.996,57.546,67.603,69.944,64.692,66.5,70.904,70.958,72.335,78.616,97.425,91.662,76.709,70.192,62.982,70.18,64.055,87.948 Ireland,0.45347,0.45347,0.45347,0.45347,0.45347,0.45347,0.45347,0.45977,0.52906,0.52906,0.52906,0.52176,0.50839,0.51827,0.54313,0.57397,0.70662,0.7279,0.66217,0.62038,0.61792,0.78889,0.89461,1.02173,1.1714,1.20068,0.94358,0.85443,0.83354,0.89585,0.76767,0.78888,0.74625,0.85993,0.84898,0.79198,0.79362,0.83757,0.8917,0.93863,1.0854,1.11751,1.06255,0.88603,0.80537,0.80412,0.79714,0.73064,0.68268 Italy,0.32226,0.32279,0.32279,0.32279,0.32279,0.32279,0.32279,0.32279,0.32279,0.32279,0.32279,0.32017,0.30121,0.30109,0.33587,0.33717,0.42987,0.45572,0.4383,0.4291,0.44232,0.58709,0.69851,0.78442,0.90739,0.98614,0.76994,0.66936,0.67223,0.70863,0.61877,0.64072,0.63649,0.81273,0.83276,0.84127,0.79687,0.87958,0.89668,0.93863,1.0854,1.11751,1.06255,0.88603,0.80537,0.80412,0.79714,0.73064,0.68268 Japan,360,360,360,360,360,360,360,360,360,360,360,349.33,303.17,271.7,292.08,296.79,296.55,268.51,210.44,219.14,226.74,220.54,249.08,237.51,237.52,238.54,168.52,144.64,128.15,137.96,144.79,134.71,126.65,111.2,102.21,94.06,108.78,120.99,130.91,113.91,107.77,121.53,125.39,115.93,108.19,110.22,116.3,117.75,103.36 Korea,..,..,..,..,..,..,271.3,270.5,276.7,288.2,310.6,347.2,392.9,398.3,404.5,484,484,484,484,484,607.4,681,731.1,775.8,806,870,881.5,822.6,731.5,671.5,707.8,733.4,780.7,802.7,803.4,771.3,804.5,951.3,1401.4,1188.8,1131,1291,1251.1,1191.6,1145.3,1024.1,954.8,929.3,1102.1 Luxembourg,1.23947,1.23947,1.23947,1.23947,1.23947,1.23947,1.23947,1.23947,1.23947,1.23947,1.23947,1.21145,1.09109,0.9662,0.96558,0.91173,0.957,0.88852,0.78067,0.72679,0.72488,0.92041,1.13264,1.26752,1.43243,1.47194,1.10739,0.92549,0.91146,0.9768,0.82841,0.84651,0.79697,0.85762,0.82936,0.73079,0.76752,0.88681,0.89982,0.93863,1.0854,1.11751,1.06255,0.88603,0.80537,0.80412,0.79714,0.73064,0.68268 Mexico,0.013,0.013,0.013,0.013,0.013,0.013,0.013,0.013,0.013,0.013,0.013,0.013,0.013,0.013,0.013,0.013,0.015,0.023,0.023,0.023,0.023,0.025,0.056,0.12,0.168,0.257,0.612,1.378,2.273,2.462,2.813,3.018,3.095,3.116,3.375,6.419,7.599,7.918,9.136,9.56,9.456,9.342,9.656,10.789,11.286,10.898,10.899,10.928,11.13 Netherlands,1.72436,1.6563,1.64268,1.64268,1.64268,1.64268,1.64268,1.64268,1.64268,1.64268,1.64268,1.58933,1.45641,1.26857,1.21993,1.14761,1.19977,1.11369,0.98179,0.91028,0.90217,1.13227,1.21169,1.29515,1.45604,1.50719,1.11177,0.91922,0.89693,0.96235,0.82631,0.84842,0.79796,0.84281,0.82588,0.72863,0.76503,0.88545,0.90018,0.93863,1.0854,1.11751,1.06255,0.88603,0.80537,0.80412,0.79714,0.73064,0.68268 New Zealand,0.7143,0.7155,0.7192,0.7192,0.7192,0.7192,0.7192,0.7337,0.8929,0.8929,0.8929,0.8806,0.8368,0.7368,0.7154,0.8323,1.0049,1.0303,0.9644,0.9785,1.0267,1.1528,1.3326,1.4968,1.764,2.0234,1.9132,1.6946,1.5264,1.6722,1.6762,1.7335,1.8618,1.8505,1.6865,1.5239,1.4549,1.5124,1.8683,1.8896,2.2012,2.3788,2.1622,1.7221,1.5087,1.4203,1.5421,1.3607,1.4227 Norway,7.1429,7.1429,7.1429,7.1429,7.1429,7.1429,7.1429,7.1429,7.1429,7.1429,7.1429,7.0418,6.5883,5.7658,5.5397,5.2269,5.4565,5.3235,5.2423,5.0641,4.9392,5.7395,6.454,7.2964,8.1615,8.5972,7.3947,6.7375,6.517,6.9045,6.2597,6.4829,6.2145,7.0941,7.0576,6.3352,6.4498,7.0734,7.5451,7.7992,8.8018,8.9917,7.9838,7.0802,6.7408,6.4425,6.4133,5.8617,5.64 Poland,..,..,..,..,..,..,0.0004,0.0004,0.0004,0.0004,0.0004,0.0004,0.0004,0.0003,0.0003,0.0003,0.0003,0.0003,..,0.004,0.0044,0.0051,0.0085,0.0092,0.0113,0.0147,0.0175,0.0265,0.0431,0.1439,0.95,1.0576,1.3626,1.8115,2.2723,2.425,2.6961,3.2793,3.4754,3.9671,4.3461,4.0939,4.08,3.8891,3.6576,3.2355,3.1032,2.768,2.4092 Portugal,0.1434,0.1434,0.1434,0.1434,0.1434,0.1434,0.1434,0.1434,0.1434,0.1434,0.1434,0.14122,0.13494,0.12228,0.12673,0.12746,0.15078,0.19092,0.21916,0.24403,0.24971,0.30699,0.39641,0.55257,0.73019,0.84993,0.74614,0.70272,0.71804,0.7854,0.71106,0.72067,0.67337,0.80207,0.82797,0.75371,0.76937,0.87445,0.89835,0.93863,1.0854,1.11751,1.06255,0.88603,0.80537,0.80412,0.79714,0.73064,0.68268 Slovak Republic,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,1.0214,1.0637,0.9863,1.0175,1.1159,1.1695,1.373,1.5281,1.6051,1.5046,1.2206,1.0707,1.0296,0.9858,0.8197,0.7091 Spain,0.36061,0.36061,0.36061,0.36061,0.36061,0.36061,0.36061,0.37063,0.42071,0.42071,0.42071,0.41752,0.38628,0.35015,0.3467,0.34502,0.4021,0.45654,0.46078,0.40343,0.43094,0.55487,0.66027,0.86203,0.96619,1.02199,0.84171,0.74212,0.7001,0.71147,0.61264,0.62452,0.61531,0.76485,0.8051,0.7494,0.76125,0.87997,0.89788,0.93863,1.0854,1.11751,1.06255,0.88603,0.80537,0.80412,0.79714,0.73064,0.68268 Sweden,5.1732,5.1732,5.1732,5.1732,5.1732,5.1732,5.1732,5.1732,5.1732,5.1732,5.1732,5.1168,4.7624,4.3673,4.4394,4.1522,4.3559,4.4816,4.5185,4.2871,4.2296,5.0634,6.2826,7.6671,8.2718,8.6039,7.1236,6.3404,6.1272,6.4469,5.9188,6.0475,5.8238,7.7834,7.716,7.1333,6.706,7.6349,7.9499,8.2624,9.1622,10.3291,9.7371,8.0863,7.3489,7.4731,7.3783,6.7588,6.5911 Switzerland,4.373,4.373,4.373,4.373,4.373,4.373,4.373,4.373,4.373,4.373,4.373,4.1342,3.8193,3.1648,2.9793,2.5813,2.4996,2.4035,1.788,1.6627,1.6757,1.9642,2.0303,2.0991,2.3497,2.4571,1.7989,1.4912,1.4633,1.6359,1.3892,1.434,1.4062,1.4776,1.3677,1.1825,1.236,1.4513,1.4498,1.5022,1.6888,1.6876,1.5586,1.3467,1.2435,1.2452,1.2538,1.2004,1.0831 Turkey,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,0.0001,0.0001,0.0002,0.0002,0.0004,0.0005,0.0007,0.0009,0.0014,0.0021,0.0026,0.0042,0.0069,0.011,0.0296,0.0458,0.0814,0.1519,0.2607,0.4188,0.6252,1.2256,1.5072,1.5009,1.4255,1.3436,1.4285,1.3029,1.3015 United Kingdom,0.35714,0.35714,0.35714,0.35714,0.35714,0.35714,0.35714,0.3621,0.41667,0.41667,0.41667,0.41092,0.40039,0.40817,0.42776,0.45204,0.55651,0.57327,0.52151,0.47218,0.4303,0.49764,0.57245,0.65973,0.75181,0.77925,0.6822,0.61193,0.56217,0.61117,0.56318,0.56702,0.56977,0.66676,0.65343,0.63367,0.64096,0.61084,0.60382,0.61806,0.66093,0.69466,0.66722,0.61247,0.54618,0.55,0.54349,0.49977,0.54397 United States,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 Euro area,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,0.76452,0.78756,0.8818,0.89199,0.93863,1.0854,1.11751,1.06255,0.88603,0.80537,0.80412,0.79714,0.73064,0.68268 Brazil,0.0001,0.0001,0.0001,0.0002,0.0005,0.0007,0.0009,0.001,0.0013,0.0016,0.0018,0.002,0.0023,0.0024,0.0026,0.0031,0.0041,0.0055,0.007,0.0104,0.0203,0.0359,0.0693,0.2227,0.7131,2.3925,5.2694,15.137,79.6677,-,-,0.0001,0.0016,0.0322,0.6393,0.9177,1.0051,1.078,1.1605,1.8139,1.8294,2.3496,2.9204,3.0775,2.9251,2.4344,2.1753,1.9471,1.8338 Chile,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,396.77,412.27,419.3,460.29,508.78,539.59,634.94,688.94,691.4,609.53,559.77,530.28,522.46,522.46 China,2.462,2.462,2.462,2.462,2.462,2.462,2.462,2.462,2.462,2.462,2.462,2.462,2.245,1.989,1.961,1.86,1.941,1.858,1.684,1.555,1.498,1.705,1.893,1.976,2.32,2.937,3.453,3.722,3.722,3.765,4.783,5.323,5.515,5.762,8.619,8.351,8.314,8.29,8.279,8.278,8.279,8.277,8.277,8.277,8.277,8.194,7.973,7.608,6.949 Estonia,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,13.223,12.991,11.465,12.038,13.882,14.075,14.678,16.969,17.478,16.612,13.856,12.596,12.584,12.466,11.434,10.694 India,4.77,4.78,4.77,4.78,4.79,4.79,6.3,7.56,7.58,7.59,7.57,7.52,7.59,7.74,8.1,8.38,8.96,8.74,8.19,8.13,7.86,8.66,9.46,10.1,11.36,12.37,12.61,12.96,13.92,16.23,17.5,22.74,25.92,30.49,31.37,32.43,35.43,36.31,41.26,43.06,44.94,47.19,48.61,46.58,45.32,44.1,45.31,41.35,43.51 Indonesia,..,..,..,..,..,..,..,150,296,326,363,392,415,415,415,415,415,415,442,623,627,632,661,909,1026,1111,1283,1644,1686,1770,1843,1950,2030,2087,2161,2249,2342,2909,10014,7855,8422,10261,9311,8577,8939,9705,9159,9141,9699 Israel 1,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,3.0113,3.1917,3.4494,3.8001,4.1397,4.0773,4.2057,4.7378,4.5541,4.482,4.4877,4.4558,4.1081,3.588 Russian Federation,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,0.992,2.191,4.559,5.121,5.785,9.705,24.62,28.129,29.169,31.349,30.692,28.814,28.284,27.191,25.581,24.853 Slovenia,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,0.11505,0.3392,0.47255,0.53751,0.49457,0.56486,0.66637,0.69326,0.75851,0.92913,1.01297,1.00254,0.86427,0.80279,0.80414,0.79715,0.73064,0.68268 South Africa,0.713,0.715,0.713,0.715,0.717,0.716,0.717,0.717,0.717,0.718,0.716,0.712,0.773,0.694,0.679,0.74,0.87,0.87,0.87,0.842,0.779,0.878,1.086,1.114,1.475,2.229,2.285,2.036,2.273,2.623,2.587,2.761,2.852,3.268,3.551,3.627,4.299,4.608,5.528,6.109,6.94,8.609,10.541,7.565,6.46,6.359,6.772,7.045,8.261 public static ArrayList<String> getYears() throws IOException { File file = new File("exchangerates.csv"); BufferedReader br = new BufferedReader(new FileReader(file)); ArrayList<String> years = new ArrayList<String>(); String line = br.readLine(); String year = ""; for(int i = 1; i < line.length(); i++) { if(line.charAt(i) != ',' && i != line.length()-1) { year = year + line.charAt(i); } else if(i == line.length()-1) { year = year + line.charAt(i); years.add(year); } else { years.add(year); year = ""; } } br.close(); return years; } public static LinkedHashMap<String,LinkedHashMap<String,Double>> getExchangeRates() throws IOException { File file = new File("exchangerates.csv"); BufferedReader br = new BufferedReader(new FileReader(file)); //burn first line br.readLine(); LinkedHashMap<String,LinkedHashMap<String,Double>> exchangeRatesTable = new LinkedHashMap<String,LinkedHashMap<String,Double>>(); String line = null; while((line = br.readLine()) != null) { String country = ""; int index = 0; while(line.charAt(index) != ',') { country = country + line.charAt(index); index++; } index++; //skip comma LinkedHashMap<String,Double> yearlyRateMap = new LinkedHashMap<String,Double>(); for(String year : getYears()) { String rateString = ""; for(int k = index; k < line.length(); k++) { if(line.charAt(k) != ',' && k != line.length()-1) { rateString = rateString + line.charAt(k); index++; } else if(k == line.length()-1) { rateString = rateString + line.charAt(k); index++; if(!rateString.equals("..")) { Double exchangeRate = new Double(rateString); yearlyRateMap.put(year, exchangeRate); } else { index++; break; } break; } else { if(!rateString.equals("..") && !rateString.equals("-")) { index++; Double exchangeRate = new Double(rateString); yearlyRateMap.put(year, exchangeRate); } else { index++; break; } break; } } } exchangeRatesTable.put(country, yearlyRateMap); } br.close(); return exchangeRatesTable; }
How to find size of ArrayList<String> in my map?
I want to find the size of each value from the key-value pair in Map<Integer, ArrayList<String>>. Simply writing list.size() does not work. Here's my code: public void getF() throws Exception { BufferedReader br2 = new BufferedReader( new FileReader("/home/abc/NetBeansProjects/network1.txt")); System.out.println("hello" +r.usr); while ((s= br2.readLine()) != null) { String F[]= s.split(":"); for (String uid : F) { if (uid == F[0]) { user.add(uid); } else { li = followee.get(Integer.valueOf(F[0])); if (li == null) { followee.put(Integer.valueOf(F[0]), li= new ArrayList<String>()); } li.add(uid); } System.out.println(followee); int g = li.size(); System.out.println("g:" +g); [...] } } } Why am I not getting correct size on last line?
Try to follow the data structures, by keeping the variable as close to their usage. (I know in other languages the convention is to declare them at the top.) Here li should be kept at the begin of a while-step. And its more natural to handle f[0] outside the loop, instead of for+if. I think the latter put you on the wrong foot. Set<String> user = new HashSet<>(); Map<Integer, List<String>> followee = new HashMap<>(); String s; while ((s = br2.readLine()) != null) { // s has the format "key:value value value" String keyAndValues[] = s.split(":", 2); if (keyAndValues.length != 2) { continue; } Integer key = Integer.valueOf(keyAndValues[0]); String values = keyAndValues[1]; user.add(keyAndValues[0]); List<String> li = followee.get(key); if (li == null) { li = new ArrayList<>(); followee.put(key, li); } Collections.addAll(values.split(" +"); System.out.println(followee); int g = li.size(); System.out.println("g:" + g); //[...] }
Java File I/O help
I have a problem with my code. I need to do several operations on a log file with this structure: 190.12.1.100 2011-03-02 12:12 test.html 190.12.1.100 2011-03-03 13:18 data.html 128.33.100.1 2011-03-03 15:25 test.html 128.33.100.1 2011-03-04 18:30 info.html I need to get the number of visits per month, number of visits per page and number of unique visitors based on the IP. That is not the question, I managed to get all three operations working. The problem is, only the first choice runs correctly while the other choices just return values of 0 afterwards, as if the file is empty, so i am guessing i made a mistake with the I/O somewhere. Here's the code: import java.io.*; import java.util.*; public class WebServerAnalyzer { private Map<String, Integer> hm1; private Map<String, Integer> hm2; private int[] months; private Scanner input; public WebServerAnalyzer() throws IOException { hm1 = new HashMap<String, Integer>(); hm2 = new HashMap<String, Integer>(); months = new int[12]; for (int i = 0; i < 12; i++) { months[i] = 0; } File file = new File("webserver.log"); try { input = new Scanner(file); } catch (FileNotFoundException fne) { input = null; } } public String nextLine() { String line = null; if (input != null && input.hasNextLine()) { line = input.nextLine(); } return line; } public int getMonth(String line) { StringTokenizer tok = new StringTokenizer(line); if (tok.countTokens() == 4) { String ip = tok.nextToken(); String date = tok.nextToken(); String hour = tok.nextToken(); String page = tok.nextToken(); StringTokenizer dtok = new StringTokenizer(date, "-"); if (dtok.countTokens() == 3) { String year = dtok.nextToken(); String month = dtok.nextToken(); String day = dtok.nextToken(); int m = Integer.parseInt(month); return m; } } return -1; } public String getIP(String line) { StringTokenizer tok = new StringTokenizer(line); if (tok.countTokens() == 4) { String ip = tok.nextToken(); String date = tok.nextToken(); String hour = tok.nextToken(); String page = tok.nextToken(); StringTokenizer dtok = new StringTokenizer(date, "-"); return ip; } return null; } public String getPage(String line) { StringTokenizer tok = new StringTokenizer(line); if (tok.countTokens() == 4) { String ip = tok.nextToken(); String date = tok.nextToken(); String hour = tok.nextToken(); String page = tok.nextToken(); StringTokenizer dtok = new StringTokenizer(date, "-"); return page; } return null; } public void visitsPerMonth() { String line = null; do { line = nextLine(); if (line != null) { int m = getMonth(line); if (m != -1) { months[m - 1]++; } } } while (line != null); // Print the result String[] monthName = {"JAN ", "FEB ", "MAR ", "APR ", "MAY ", "JUN ", "JUL ", "AUG ", "SEP ", "OCT ", "NOV ", "DEC "}; for (int i = 0; i < 12; i++) { System.out.println(monthName[i] + months[i]); } } public int count() throws IOException { InputStream is = new BufferedInputStream(new FileInputStream("webserver.log")); try { byte[] c = new byte[1024]; int count = 0; int readChars = 0; while ((readChars = is.read(c)) != -1) { for (int i = 0; i < readChars; ++i) { if (c[i] == '\n') ++count; } } return count; } finally { is.close(); } } public void UniqueIP() throws IOException{ String line = null; for (int x = 0; x <count(); x++){ line = nextLine(); if (line != null) { if(hm1.containsKey(getIP(line)) == false) { hm1.put(getIP(line), 1); } else { hm1.put(getIP(line), hm1.get(getIP(line)) +1 ); } } } Set set = hm1.entrySet(); Iterator i = set.iterator(); System.out.println("\nNumber of unique visitors: " + hm1.size()); while(i.hasNext()) { Map.Entry me = (Map.Entry)i.next(); System.out.print(me.getKey() + " - "); System.out.println(me.getValue() + " visits"); } } public void pageVisits() throws IOException{ String line = null; for (int x = 0; x <count(); x++){ line = nextLine(); if (line != null) { if(hm2.containsKey(getPage(line)) == false) hm2.put(getPage(line), 1); else hm2.put(getPage(line), hm2.get(getPage(line)) +1 ); } } Set set = hm2.entrySet(); Iterator i = set.iterator(); System.out.println("\nNumber of pages visited: " + hm2.size()); while(i.hasNext()) { Map.Entry me = (Map.Entry)i.next(); System.out.print(me.getKey() + " - "); System.out.println(me.getValue() + " visits"); } } Any help figuring out the problem would be much appreciated as I am quite stuck.
I didn't read the code thoroughly yet, but I guess you're not setting the read position back to the beginning of the file when you start a new operation. Thus nextLine() would return null. You should create a new Scanner for each operation and close it afterwards. AFAIK scanner doesn't provide a method to go back to the first byte. Currently I could also think of 3 alternatives: Use a BufferedReader and call reset() for each new operation. This should cause the reader to go back to byte 0 provided you didn't call mark() somewhere. Read the file contents once and iterate over the lines in memory, i.e. put all lines into a List<String> and then start at each line. Read the file once, parse each line and construct an apropriate data structure that contains the data you need. For example, you could use a TreeMap<Date, Map<Page, Map<IPAdress, List<Visit>>>>, i.e. you'd store the visits per ip address per page for each date. You could then select the appropriate submaps by date, page and ip address.
The reset method of BufferedReader that Thomas recommended would only work if the file size is smaller than the buffer size or if you called mark with a large enough read ahead limit. I would recommend reading throught the file once and to update your maps and month array for each line. BTW, you don't need a Scanner just to read lines, BufferedReader has a readLine method itself. BufferedReader br = ...; String line; while (null != (line = br.readLine())) { String ip = getIP(line); String page = getPage(line); int month = getMonth(line); // update hashmaps and arrays }
Problem with ArrayLists and reading a file
I am having difficulty with the following method. I can't figure out if my problem is, but I have narrowed it down to not populating the array list from the file. Any help is greatly appreciated. private void searchButtonActionPerformed(java.awt.event.ActionEvent evt) { //create arraylists ArrayList<String> model = new ArrayList<String>(); ArrayList<String> length = new ArrayList<String>(); ArrayList<String> width = new ArrayList<String>(); ArrayList<String> radius = new ArrayList<String>(); ArrayList<String> depth = new ArrayList<String>(); ArrayList<String> volume = new ArrayList<String>(); ArrayList<String> shape = new ArrayList<String>(); //fill arraylists from file try { String outputline = ""; BufferedReader fin = new BufferedReader(new FileReader("stock.dat")); while((outputline = fin.readLine()) != null) { // for(int i = 0; i < outputline.length(); i++) { int i = 0; //model boolean flag = false; String pass = ""; while(flag = false) { if(outputline.charAt(i) != ',') pass.concat(Character.toString(outputline.charAt(i))); else flag = true; i++; } model.add(pass); //length flag = false; pass = ""; while(flag = false) { if(outputline.charAt(i) != ',') pass.concat(Character.toString(outputline.charAt(i))); else flag = true; } length.add(pass); //width flag = false; pass = ""; while(flag = false) { if(outputline.charAt(i) != ',') pass.concat(Character.toString(outputline.charAt(i))); else flag = true; } width.add(pass); //radius flag = false; pass = ""; while(flag = false) { if(outputline.charAt(i) != ',') pass.concat(Character.toString(outputline.charAt(i))); else flag = true; } radius.add(pass); //depth flag = false; pass = ""; while(flag = false) { if(outputline.charAt(i) != ',') pass.concat(Character.toString(outputline.charAt(i))); else flag = true; } depth.add(pass); //volume flag = false; pass = ""; while(flag = false) { if(outputline.charAt(i) != ',') pass.concat(Character.toString(outputline.charAt(i))); else flag = true; } volume.add(pass); //shape pass = ""; for(int j = i; j < outputline.length(); j++) pass.concat(Character.toString(outputline.charAt(i))); shape.add(pass); } fin.close(); } catch(IOException e) { System.err.print("Unable to read from file"); System.exit(-1); } int at = -1; for(int i = 0; i < model.size(); i++) { if(model.get(i).equals(searchIn.getText())) { at = i; i = model.size(); } } Component frame = null; if(at != -1) { searchDepthOut.setText(depth.get(at)); searchLengthOut.setText(length.get(at)); searchRadiusOut.setText(radius.get(at)); searchVolumeOut.setText(volume.get(at)); searchWidthOut.setText(width.get(at)); } else JOptionPane.showMessageDialog(null, "Your search did not return any results", "ERORR", JOptionPane.ERROR_MESSAGE); }
Split the readline by a comma and be done with it. I'd also create an object for the model, length,width,etc... and then have 1 arraylist of that object. while((outputline = fin.readLine()) != null) { String[] tokens = outputline.split(","); if(tokens.length == 7){ SObj o = new SObj; //Some Object o.model = tokens[0]; o.length = tokens[1]; //and so on oList.add(o); } }
Aside from all the other problems people have listed... String pass = ""; while(flag = false) { if(outputline.charAt(i) != ',') pass.concat(Character.toString(outputline.charAt(i))); pass is a String. Strings are immutable. You want pass = pass.concat(.....)
while(flag = false) will never be run - it always evaluates to false. Try while (!flag)
I would suggest you restructure the code. The issue is not just that there's some sort of parser error, but that it's sort of hard to tell what's going on - the code is clearly making assumptions about the structure of the input line, but you have to kind of read through and trace the method to restructure it in your mind. Something like /** Expect a line of the form model, length, ..., return a list of ... */ private String[] parse (String inputLine) { //check input line charachteristics-not null, length, ... String out= inputLine.split(","); if (out.length()!= ... //whatever sanity checking... } private List<String[]> extract(BufferedReader fin) { while((outputline = fin.readLine()) != null) { //do something with parse(outputline); } } The helpful thing will be to separate out the file reading and the line parsing, so that instead of doing it all in a long sequence you can see what's breaking, most likely an assumption about the line structure that's buried in the code. Does it need 4 comma separated integers? 5? how about if they're padded with spaces? prefixed with an empty line?