102 lines
3.0 KiB
Java
102 lines
3.0 KiB
Java
package info.augendre.name_picker;
|
|
|
|
import javax.swing.*;
|
|
import java.io.File;
|
|
import java.io.FileNotFoundException;
|
|
import java.io.IOException;
|
|
import java.nio.file.Files;
|
|
import java.nio.file.Path;
|
|
import java.nio.file.Paths;
|
|
import java.text.Normalizer;
|
|
import java.util.*;
|
|
import java.util.stream.Collectors;
|
|
|
|
/**
|
|
* Created by gaugendre on 18/04/2016 13:56.
|
|
*/
|
|
public class ComputeResults implements Runnable {
|
|
private final int LENGTH = 6;
|
|
private final String VOWELS = "aeiouy";
|
|
private final MainPanel mainPanel;
|
|
private File file;
|
|
|
|
public ComputeResults(MainPanel mainPanel) {
|
|
this.file = mainPanel.getNamesFile();
|
|
this.mainPanel = mainPanel;
|
|
}
|
|
|
|
@Override
|
|
public void run() {
|
|
try {
|
|
Path filePath = Paths.get(file.getAbsolutePath());
|
|
Set<String> validStrings = Files.lines(filePath).parallel().filter(this::isValid).collect(Collectors.toSet());
|
|
mainPanel.getValidNamesList().setListData(validStrings.toArray());
|
|
}
|
|
catch (FileNotFoundException e) {
|
|
System.err.println("ERR: Le fichier source n'existe pas ou le fichier de destination ne peut être crée ou ouvert.");
|
|
}
|
|
catch (IOException e) {
|
|
System.err.println("ERR: entrée/sortie.");
|
|
}
|
|
}
|
|
|
|
private boolean isValid(String s) {
|
|
s = Normalizer.normalize(s, Normalizer.Form.NFD);
|
|
s = s.replaceAll("\\p{M}", "");
|
|
s = s.toLowerCase();
|
|
return lengthValidator(s)
|
|
&& vowelsAlternanceValidator(s)
|
|
&& containsValidator(s)
|
|
&& touchesOnceValidator(s)
|
|
&& noLetterRepeatValidator(s);
|
|
}
|
|
|
|
private boolean lengthValidator(String s) {
|
|
return s.length() == LENGTH;
|
|
}
|
|
|
|
private boolean vowelsAlternanceValidator(String s) {
|
|
boolean previousIsVowel = isVowel(s.charAt(0));
|
|
|
|
for (int i = 1; i < s.length(); i++) {
|
|
char c = s.charAt(i);
|
|
boolean currentIsVowel = isVowel(c);
|
|
|
|
if (currentIsVowel && previousIsVowel || !currentIsVowel && !previousIsVowel) {
|
|
return false;
|
|
}
|
|
previousIsVowel = currentIsVowel;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
private boolean isVowel(char o) {
|
|
o = Character.toLowerCase(o);
|
|
return VOWELS.indexOf(o) >= 0;
|
|
}
|
|
|
|
private boolean containsValidator(String s) {
|
|
return s.charAt(s.length() - 1) != 'a' && s.indexOf('h') < 0;
|
|
}
|
|
|
|
private boolean touchesOnceValidator(String s) {
|
|
return (s.contains("b") ? 1 : 0) +
|
|
(s.contains("m") ? 1 : 0) +
|
|
(s.contains("p") ? 1 : 0) == 1;
|
|
}
|
|
|
|
private boolean noLetterRepeatValidator(String s) {
|
|
Map<Character, Integer> map = new HashMap<>();
|
|
for (int i = 0; i < s.length(); i++) {
|
|
char current = s.charAt(i);
|
|
int count = map.getOrDefault(current, 0) + 1;
|
|
if (count > 1) {
|
|
return false;
|
|
}
|
|
map.put(current, count + 1);
|
|
}
|
|
return true;
|
|
}
|
|
|
|
}
|