Skip to main content
Code Review

Return to Question

Tweeted twitter.com/StackCodeReview/status/869445934106673152
deleted 7 characters in body
Source Link
gommb
  • 195
  • 1
  • 7
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import javax.swing.JFileChooser;
public class FrequencyCounter {
 
 public static void main(String[] args) throws IOException {
 JFileChooser fc = new JFileChooser();
 File file = null;
 fc.setCurrentDirectory(new File(System.getProperty("user.dir")));
 if (fc.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
 file = fc.getSelectedFile();
 }
 FileReader is = new FileReader(file);
 char[] scriptBytes = new char[(int) file.length()];
 is.read(scriptBytes);
 is.close();
 String script = new String(scriptBytes);
 String[] words = script.split("[ \\r?\\n\\-]");
 List<String> wordList = new ArrayList<>(Arrays.asList(words));
 wordList = cleaner(wordList);
 HashMap<String, Integer> counter = new HashMap<>();
 for (String word : wordList) {
 if (counter.containsKey(word))
 counter.put(word, counter.get(word) + 1);
 else
 counter.put(word, 1);
 }
 counter = entriesSortedByValues(counter);
 BufferedWriter writer = new BufferedWriter(new FileWriter(new File(file.getAbsolutePath().replace(file.getName(), "") + "result_" + file.getName())));
 for (Entry<String, Integer> ent : counter.entrySet()) {
 writer.write(ent.getKey() + " " + ent.getValue() + "\n");
 writer.newLine();
 }
 writer.close();
 }
 
 private static List<String> cleaner(List<String> words) {
 for (int i = 0; i < words.size(); i++) {
 words.set(i, words.get(i).replaceAll("[1234567—890!@#$%^&*()_+|\\-=~`{}\\[\\]:;\"<>,.?/]","").toLowerCase());
 }
 words.removeAll(Arrays.asList(""));
 return words;
 }
 
 private static <K,V extends Comparable<? super V>> 
 HashMap<K, V> entriesSortedByValues(Map<K,V> map) {
 List<Entry<K,V>> sortedEntries = new ArrayList<Entry<K,V>>(map.entrySet());
 
 Collections.sort(sortedEntries, 
 new Comparator<Entry<K,V>>() {
 @Override
 public int compare(Entry<K,V> e1, Entry<K,V> e2) {
 return e2.getValue().compareTo(e1.getValue());
 }
 }
 );
 HashMap<K,V> result = new LinkedHashMap<K,V>();
 for (Entry<K,V> ent : sortedEntries)
 result.put(ent.getKey(), ent.getValue());
 
 return result;
 }
 
}
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import javax.swing.JFileChooser;
public class FrequencyCounter {
 
 public static void main(String[] args) throws IOException {
 JFileChooser fc = new JFileChooser();
 File file = null;
 fc.setCurrentDirectory(new File(System.getProperty("user.dir")));
 if (fc.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
 file = fc.getSelectedFile();
 }
 FileReader is = new FileReader(file);
 char[] scriptBytes = new char[(int) file.length()];
 is.read(scriptBytes);
 is.close();
 String script = new String(scriptBytes);
 String[] words = script.split("[ \\r?\\n\\-]");
 List<String> wordList = new ArrayList<>(Arrays.asList(words));
 wordList = cleaner(wordList);
 HashMap<String, Integer> counter = new HashMap<>();
 for (String word : wordList) {
 if (counter.containsKey(word))
 counter.put(word, counter.get(word) + 1);
 else
 counter.put(word, 1);
 }
 counter = entriesSortedByValues(counter);
 BufferedWriter writer = new BufferedWriter(new FileWriter(new File(file.getAbsolutePath().replace(file.getName(), "") + "result_" + file.getName())));
 for (Entry<String, Integer> ent : counter.entrySet()) {
 writer.write(ent.getKey() + " " + ent.getValue() + "\n");
 writer.newLine();
 }
 writer.close();
 }
 
 private static List<String> cleaner(List<String> words) {
 for (int i = 0; i < words.size(); i++) {
 words.set(i, words.get(i).replaceAll("[1234567—890!@#$%^&*()_+|\\-=~`{}\\[\\]:;\"<>,.?/]","").toLowerCase());
 }
 words.removeAll(Arrays.asList(""));
 return words;
 }
 
 private static <K,V extends Comparable<? super V>> 
 HashMap<K, V> entriesSortedByValues(Map<K,V> map) {
 List<Entry<K,V>> sortedEntries = new ArrayList<Entry<K,V>>(map.entrySet());
 
 Collections.sort(sortedEntries, 
 new Comparator<Entry<K,V>>() {
 @Override
 public int compare(Entry<K,V> e1, Entry<K,V> e2) {
 return e2.getValue().compareTo(e1.getValue());
 }
 }
 );
 HashMap<K,V> result = new LinkedHashMap<K,V>();
 for (Entry<K,V> ent : sortedEntries)
 result.put(ent.getKey(), ent.getValue());
 
 return result;
 }
 
}
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import javax.swing.JFileChooser;
public class FrequencyCounter {
 
 public static void main(String[] args) throws IOException {
 JFileChooser fc = new JFileChooser();
 File file = null;
 fc.setCurrentDirectory(new File(System.getProperty("user.dir")));
 if (fc.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
 file = fc.getSelectedFile();
 }
 FileReader is = new FileReader(file);
 char[] scriptBytes = new char[(int) file.length()];
 is.read(scriptBytes);
 is.close();
 String script = new String(scriptBytes);
 String[] words = script.split("[ \\r?\\n\\-]");
 List<String> wordList = new ArrayList<>(Arrays.asList(words));
 wordList = cleaner(wordList);
 HashMap<String, Integer> counter = new HashMap<>();
 for (String word : wordList) {
 if (counter.containsKey(word))
 counter.put(word, counter.get(word) + 1);
 else
 counter.put(word, 1);
 }
 counter = entriesSortedByValues(counter);
 BufferedWriter writer = new BufferedWriter(new FileWriter(new File(file.getAbsolutePath().replace(file.getName(), "") + "result_" + file.getName())));
 for (Entry<String, Integer> ent : counter.entrySet()) {
 writer.write(ent.getKey() + " " + ent.getValue());
 writer.newLine();
 }
 writer.close();
 }
 
 private static List<String> cleaner(List<String> words) {
 for (int i = 0; i < words.size(); i++) {
 words.set(i, words.get(i).replaceAll("[1234567—890!@#$%^&*()_+|\\-=~`{}\\[\\]:;\"<>,.?/]","").toLowerCase());
 }
 words.removeAll(Arrays.asList(""));
 return words;
 }
 
 private static <K,V extends Comparable<? super V>> 
 HashMap<K, V> entriesSortedByValues(Map<K,V> map) {
 List<Entry<K,V>> sortedEntries = new ArrayList<Entry<K,V>>(map.entrySet());
 
 Collections.sort(sortedEntries, 
 new Comparator<Entry<K,V>>() {
 @Override
 public int compare(Entry<K,V> e1, Entry<K,V> e2) {
 return e2.getValue().compareTo(e1.getValue());
 }
 }
 );
 HashMap<K,V> result = new LinkedHashMap<K,V>();
 for (Entry<K,V> ent : sortedEntries)
 result.put(ent.getKey(), ent.getValue());
 
 return result;
 }
 
}
added 2 characters in body
Source Link
Jamal
  • 35.2k
  • 13
  • 134
  • 238

This is a simple word frequency counter in Java. I am just wondering if I can improve or compact this code better. You choose a file to be counted with a JFileChooserJFileChooser, and the results get outputted into a file. The biggest struggle I had was sorting the HashMapHashMap by values. I got it to work but I feel like it should be easier to sort. I'm also wondering if I should break up my code in mainmain into more methods. I saw a pythonPython script of this that does the same thing but in half the lines of code. Is that just Java or does my code need touching up?

This is a simple word frequency counter in Java. I am just wondering if I can improve or compact this code better. You choose a file to be counted with a JFileChooser, and the results get outputted into a file. The biggest struggle I had was sorting the HashMap by values. I got it to work but I feel like it should be easier to sort. I'm also wondering if I should break up my code in main into more methods. I saw a python script of this that does the same thing but in half the lines of code. Is that just Java or does my code need touching up?

This is a simple word frequency counter in Java. I am just wondering if I can improve or compact this code better. You choose a file to be counted with a JFileChooser, and the results get outputted into a file. The biggest struggle I had was sorting the HashMap by values. I got it to work but I feel like it should be easier to sort. I'm also wondering if I should break up my code in main into more methods. I saw a Python script of this that does the same thing but in half the lines of code. Is that just Java or does my code need touching up?

Source Link
gommb
  • 195
  • 1
  • 7

Java Word Frequency Counter

This is a simple word frequency counter in Java. I am just wondering if I can improve or compact this code better. You choose a file to be counted with a JFileChooser, and the results get outputted into a file. The biggest struggle I had was sorting the HashMap by values. I got it to work but I feel like it should be easier to sort. I'm also wondering if I should break up my code in main into more methods. I saw a python script of this that does the same thing but in half the lines of code. Is that just Java or does my code need touching up?

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import javax.swing.JFileChooser;
public class FrequencyCounter {
 
 public static void main(String[] args) throws IOException {
 JFileChooser fc = new JFileChooser();
 File file = null;
 fc.setCurrentDirectory(new File(System.getProperty("user.dir")));
 if (fc.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
 file = fc.getSelectedFile();
 }
 FileReader is = new FileReader(file);
 char[] scriptBytes = new char[(int) file.length()];
 is.read(scriptBytes);
 is.close();
 String script = new String(scriptBytes);
 String[] words = script.split("[ \\r?\\n\\-]");
 List<String> wordList = new ArrayList<>(Arrays.asList(words));
 wordList = cleaner(wordList);
 HashMap<String, Integer> counter = new HashMap<>();
 for (String word : wordList) {
 if (counter.containsKey(word))
 counter.put(word, counter.get(word) + 1);
 else
 counter.put(word, 1);
 }
 counter = entriesSortedByValues(counter);
 BufferedWriter writer = new BufferedWriter(new FileWriter(new File(file.getAbsolutePath().replace(file.getName(), "") + "result_" + file.getName())));
 for (Entry<String, Integer> ent : counter.entrySet()) {
 writer.write(ent.getKey() + " " + ent.getValue() + "\n");
 writer.newLine();
 }
 writer.close();
 }
 
 private static List<String> cleaner(List<String> words) {
 for (int i = 0; i < words.size(); i++) {
 words.set(i, words.get(i).replaceAll("[1234567—890!@#$%^&*()_+|\\-=~`{}\\[\\]:;\"<>,.?/]","").toLowerCase());
 }
 words.removeAll(Arrays.asList(""));
 return words;
 }
 
 private static <K,V extends Comparable<? super V>> 
 HashMap<K, V> entriesSortedByValues(Map<K,V> map) {
 List<Entry<K,V>> sortedEntries = new ArrayList<Entry<K,V>>(map.entrySet());
 
 Collections.sort(sortedEntries, 
 new Comparator<Entry<K,V>>() {
 @Override
 public int compare(Entry<K,V> e1, Entry<K,V> e2) {
 return e2.getValue().compareTo(e1.getValue());
 }
 }
 );
 HashMap<K,V> result = new LinkedHashMap<K,V>();
 for (Entry<K,V> ent : sortedEntries)
 result.put(ent.getKey(), ent.getValue());
 
 return result;
 }
 
}
lang-java

AltStyle によって変換されたページ (->オリジナル) /