Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //lab 1 v 9
- import java.io.BufferedReader;
- import java.io.File;
- import java.io.FileNotFoundException;
- import java.io.FileReader;
- import java.io.IOException;
- import java.util.Scanner;
- import java.util.*;
- class UniqueChars{//хуйня в которой храним слова
- public int cnt;//кол-во уникальных букв
- public String s;//само слово
- public UniqueChars(int _c , String _s){//тупа конструктор
- cnt = _c;
- s = _s;
- }
- }
- public class Lab1 {
- public static void main(String[] args) {
- try{
- Set<UniqueChars> list = new TreeSet<UniqueChars>(new Comparator<UniqueChars>() {//множество в котором мы храним слова
- public int compare(UniqueChars o1, UniqueChars o2) {//свой компаратор для множества. нужен для того чтоб каждое слово встречалось не более 1 раза
- return o1.s.compareTo(o2.s);
- }
- });
- BufferedReader bufferedReader = new BufferedReader(new FileReader("input.in"));//открываем текстовый файлик input.in
- int cur = bufferedReader.read();//считываем первый символ
- String s = "";
- while (cur != -1) {//пока мы не дошли до конца файла (это дерьмо bufferedReader вернет -1 в конце файла)
- char ch = (char)cur;//переводим текущий символ с int в char
- if(IsSeparator(ch)){//если текущий символ это не английская бука
- if(s.length() > 0){//и слово не пустое (на случай нескольких пробелов подряд)
- int cnt = Count(s);//находим количество уникальных букв
- if(list.size() > 0){//если до этого мы уже находили какие-то слова
- if(list.iterator().next().cnt <= cnt){//и у них количество уникальный букв <= количеству их у текущего слова
- if(list.iterator().next().cnt < cnt){//если строго меньше, то удаляем найденные до этого слова
- list.clear();
- }
- list.add(new UniqueChars(cnt , s));//то заносим это слово в список
- }
- }else{
- list.add(new UniqueChars(cnt , s));//иначе просто заносим его так как наш список пуст
- }
- s = "";//и обнуляем текущее слово
- }
- }else{
- s += ch;//если текущий символ - буква, просто дописываем ее в конец текущего слова
- }
- cur = bufferedReader.read();// читаем следующий символ с файла
- }
- int cnt = Count(s);
- if(s.length() > 0){
- if(list.size() > 0){
- if(list.iterator().next().cnt <= cnt){
- if(list.iterator().next().cnt < cnt){
- list.clear();
- }
- list.add(new UniqueChars(cnt , s));
- }
- }else{
- list.add(new UniqueChars(cnt , s));
- }
- }
- //херня аналогичная описанной выше, на случай если файл заканчивался не пробелом или другим разделителем, а буквой
- if(list.size() == 0){//если список пуст
- System.out.println("There is no words in the file");
- }else{
- for(UniqueChars uc : list){//иначе выводим слова со списка
- System.out.println(uc.s);
- }
- }
- }catch(FileNotFoundException e){//на случай если файла input.in нету
- System.out.print("File not found");
- }catch (IOException e) {//на случай хуй пойми чего, без этого не хотело работать
- e.printStackTrace();
- }
- }
- public static int Count(String s){//cчитаем уникальные буква
- int cnt = 0;//в начале их 0
- boolean[] used = new boolean['z' + 1];//used[буква] = true , если в слове уже встречалась эта буква, в начале все false
- for(int i = 0 ; i < s.length() ; ++i){//проходим по слову
- if(used[s.charAt(i)] == false){//если раньше не встретили эту букву
- used[s.charAt(i)] = true;//то отмечаем ее
- ++cnt;//и увеличиваем счетчик
- }
- }
- return cnt;
- }
- public static boolean IsSeparator(char ch){//true если ch - разделитель, иначе, если буква - то false
- if('a' <= ch && 'z' >= ch)return false;
- if('A' <= ch && 'Z' >= ch)return false;
- return true;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement