• Как вы относитесь к возможности сортировки вопросов Тостера по степени их сложности?

    kumaxim
    @kumaxim
    Web-программист
    "Рейтинг сложности" мне кажется бредом. Я начал программировать 11 лет назад, окончил ВУЗ по ИТ-специальности, участвовал в паре hightload проектах...

    Я считаю что сложность вопроса - вещь весьма относительная. Допустим для меня любые вопросы про начало своего дела являются элементарными, я на них могу без проблем ответить в 3 часа ночи, если меня разбудят. А являются они таковыми для меня, т.к. у меня было 6 проваленных проектов, на которых я набил себе огромную кучу шишек(и как разработчик, и как руководитель/основатель).

    Однако, для человека, который создает вопрос типа "Откуда взять трафик" или "Как оптимизировать сайт" вряд ли за плечами имеет мой опыт. Да и откуда он возьмет его?! Я сам раньше таким был, отсюда и все мои шишки... Я не считаю правильным посылать нафиг новичков, только потому что они новички. Пройдет пару лет, эти ребята набьют свои шишки, получат свой опыт и станут нормальными специалистами.

    Возвращаясь к вопросу что делать с таким вопросом сейчас.
    Давайте возьмем какой-нибудь тег, например Laravel. Пусть в теге 300 вопросов, 11 тыс. лайков и 2 тыс. человек, которые участвуют в его обсуждении. Давайте будем считать, что если у одного человека, есть, допустим, 10% лайков по всем вопросам данного тега, то он специалист в этом вопросе. Я думаю логично - лайки к ответам ставит сообщество, значит сообщество считает его полезным. От суда получается, что первая переменная - количество лайков в теге у конкретного человека сообщества.

    Идем далее. Вопросы могут создавать любые люди. Однако, эти люди могут быть как новыми, так и авторитетными членами сообщества. Далее давайте подумаем, новые члены сообщества у нас как раз задают тупые вопросы, следовательно они не заслуживают внимание экспертов. Отсюда имеем вторую переменную - количество лайков в теге у вопрошающего.

    Отсюда можно сделать предположение: чем больше у человека лайков в теге, тем большим специалистом он является. Следовательно, ничего не мешает ввести систему рейтинга, вида
    1. до 100 лайков - новичок
    2. от 101 до 500 - опытный пользователь
    3. от 501 до 1000 - профессионал
    4. от 1001 - эксперт


    А далее в личном кабинете, на странице администрирования тегов, добавить выпадающий список типа "Выводить мне в ленту вопросы пользователей" и варианты из моего списка выше.

    Этим решением мы достигаем:
    1)Если Вы эксперт в определенном вопросе(вяжем на тег), предложенным мною образом Вы можете отсечь вопросы второго сорта
    2)Если Вы не эксперт в этом вопросе, скорей всего Вы не сможете отделить вопросы второго сорта, от интересных вопросов, а значит раздражения у Вас они не вызовут.

    Как развитие идеи можно добавить какой-нибудь тест на знание вопроса, дающей +50 лайков, для более быстрого подъема по "лестнице".

    Я беру за основу лайки, но по идеи можно еще добавить сюда количество просмотров вопроса, количество ответов в нем, количество лайков в других ответах... Вообщем алгоритм можно дорабатывать бесконечно....
    Ответ написан
    4 комментария
  • Где я допустил ошибку?

    timych
    @timych
    package application;
    
    import java.awt.FileDialog;
    import java.awt.Frame;
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.util.Scanner;
    
    
    // Тут необязательно наследоваться от JFrame
    // Название класса  должно отображать его предназаначение
    public class BookReader {
    
    	// поля должны быть приватными
    	private FileDialog fileDialog;
    	private BookReaderCallback callback;
    
    	// Вложенный интерфейс обратного вызова
    	public interface BookReaderCallback {
    		// метод будет вызван, когда текстовый файл будет успешно прочитан до конца
    		void onReadComplete(String text);
    	}
    
    // В конструктор передаем фрейм родителя
    // не обязательно его инстанцировать в этом классе
    	public BookReader(Frame parent) {
    		fileDialog = new FileDialog(parent, "Select book", FileDialog.LOAD);
    	}
    
    	//А название метода  должно отображать его действие или результат действия
    	public void readBook() {
    
    		// show() deprecated поэтому вызываем  "setVisible"
    		fileDialog.setVisible(true);
    
    		if (fileDialog.getDirectory() == null || fileDialog.getFile() == null) {
    			return;
    		}
    
    		Scanner in = null;
    		String text = "";
    		try {
    			in = new Scanner(new File(fileDialog.getDirectory(),
    					fileDialog.getFile()));
    		} catch (FileNotFoundException e) {
    			e.printStackTrace();
    		}
    		while (in.hasNext()) {
    			text += in.nextLine() + "\n";
    		}
    		in.close();
    		// прочитали файл и теперь через обьект класса обраьтного вызова 
    		//нотифицируем вызывающий класс о том что текст прочитан и передаем ему результат
    		if (callback != null) {
    			callback.onReadComplete(text);
    		}
    
    	}
    
    	//"ceттер" для экземпляра обратного вызова
    	public void setCallback(BookReaderCallback callback) {
    		this.callback = callback;
    	}
    }
    
    package application;
    
    import java.awt.Button;
    import java.awt.Dimension;
    import java.awt.FlowLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JTextArea;
    import javax.swing.LookAndFeel;
    import javax.swing.UIManager;
    import javax.swing.UnsupportedLookAndFeelException;
    
    
    public class JFrameCreator {
    
    	public static void main(String[] args) {
    		createGUI();
    	}
    
    	public static void createGUI() {
    
    		try {
    			UIManager.setLookAndFeel((LookAndFeel) Class.forName(UIManager.getCrossPlatformLookAndFeelClassName()).newInstance());
    		} catch (InstantiationException | IllegalAccessException| ClassNotFoundException | UnsupportedLookAndFeelException e) {
    			// Игнорируем
    		}
    
    		JPanel content = new JPanel(new FlowLayout());
    		// вместо Label для текста стоит бы использовать TextArea(Label - для короткого однострочного текста),
    		JTextArea textArea = new JTextArea();
    		textArea.setText("Пока пусто...");
    		Button btnOpenFileDialog = new Button("Browse");
    		content.add(btnOpenFileDialog);
    		content.add(textArea);
    
    		JFrame frame = new JFrame("LIBRARY");
    		frame.setContentPane(content);
    		frame.setPreferredSize(new Dimension(300, 200));
    		frame.pack();
    		
    		// центрируем относительно экрана
    		frame.setLocationRelativeTo(null);
    
    		// навешиваем слушатель на кнопку 
    		// это плохой пример, скорее всего нужно навесить KeyListener, но лень имплементировать три метода
    		btnOpenFileDialog.addActionListener(new ActionListener() {
    
    			@Override
    			public void actionPerformed(ActionEvent e) {
    				// создаем обьект BookReader
    				BookReader bookReader = new BookReader(frame);
    				// передаем ему экземпляр BookReaderCallback в виде анонимного класса
    				bookReader.setCallback(new BookReader.BookReaderCallback() {
    
    					// метод будет вызван из класса BookReader как только файл будет прочитан
    					@Override
    					public void onReadComplete(String text) {
    						// меняем текст в Label
    						textArea.setText(text);
    					}
    				});
    				// запускаем "читалку" :)
    				bookReader.readBook();
    
    			}
    		});
    
    		frame.setVisible(true);
    	}
    
    }


    Если я правильно понял задачу, то вот как примерно можно было переделать. Это все упрощенно конечно (Да я и не спец в Swing ).
    А то опять какая-то каша понаписана. Старайтесь во первых называть классы и методы адекватно. Я уже говорил кстати об этом :).
    И начинайте с основ Java. Заметно что пока плохое понятие OOП.
    Ответ написан
    6 комментариев
  • Где указать начальный путь диалога выбора файла?

    timych
    @timych
    Так начинаем читать Javadoc! :)
    docs.oracle.com/javase/7/docs/api/javax/swing/JFil...
    Смотрим конструкторы
    и вуаля! Находим к примеру такие варианты:
    JFileChooser()
    Constructs a JFileChooser pointing to the user's default directory.

    JFileChooser(File currentDirectory)
    Constructs a JFileChooser using the given File as the path.

    Дефолтный (JFileChooser()) конструктор открывает начиная с дефолтной папки (В вашем случае это HOME directory)
    А вот второй, с возможностью указания стартовой директории, вам и нужен.
    Либо можно позже вызвать метод setCurrentDirectory(File dir);

    Все написано в описании.

    PS: Данный вопрос к тегу "Swift" не относится :) и к "JavaFX" тоже не очень. Это Swing
    Ответ написан
    3 комментария
  • Почему не вызывается метод?

    timych
    @timych
    olololosh: Я не понял - вы просто обращаетесь к переменной из другого класса? ("menuBar"). В Java так нельзя.
    Во первых метод menuCreator() класса MenuCreator у вас статический. Соответственно и обращаться к нему надо MenuCreator.menuCreator(); Но это не очень красиво. Поэтому я бы посоветовал убрать модификатор static.
    Во вторых если вы хотите получить какую-либо переменную из другого класса. она должна быть обьявлена в теле класса а не метода, как у вас. (я про menuBar)
    В третьих чтобы получить эту переменную, желательно сделать для нее "геттер", который и будет ее возвращать.
    В пятых даже еслы бы и у вас был доступ к переменной menuBar, эта строчка frame.setJMenuBar(menuBar); вызвала бы NullpointerException, так как menuCreator.menuCreator() вызывается позже.
    Короче такая мешанина - ужас.
    Вот как это примерно могло бы все выглядеть(но нужно весь код смотреть конечно ):

    package application;
    import java.awt.Font;
    import javax.swing.JMenu;
    import javax.swing.JMenuBar;
    
    // Этот клас может создавать нужные вам меню
    public class MenuCreator {
    
    	public JMenuBar createMenuBar() {
    		// Create menuBar
    		JMenuBar menuBar = new JMenuBar();
    		return menuBar;
    	}
    
    	public JMenu createMenu() {
    		// Create font
    		Font font = new Font("Verdana", Font.PLAIN, 11);
    		// Create File Menu
    		JMenu fileMenu = new JMenu("File");
    		fileMenu.setFont(font);
    		return fileMenu;
    	}
    }
    
    package application;
    import java.awt.Dimension;
    import javax.swing.JFrame;
    import javax.swing.JMenuBar;
    
    // в этом классе у вас происходит создание фрейма и всякая другая логика
    public class MyMainClassWithJFrame {
    
    	public static void main(String[] args) {
    
    		// ваш какой-то код...
    		JFrame frame = new JFrame();
    
    		// создаем обьект MenuCreator
    		// теперь мы можем создавать необходимые меню
    		MenuCreator menuCreator = new MenuCreator();
    		// создаем новый обьект JMenuBar
    		JMenuBar menuBar = menuCreator.createMenuBar();
    
    		frame.setJMenuBar(menuBar);
    		frame.setPreferredSize(new Dimension(800, 600));
    		frame.pack();
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
    
    		// ваш какой-то код..
    	}
    }


    Да и старайтесь называть методы как-то более логично. :) Успехов!
    Ответ написан
    2 комментария