Добавление элементов в TreeSet

266
13 июня 2019, 15:20

Использую коллекцию TreeSet. Возможно добавить не больше одной записи в add. Когда пытаюсь добавить новую, пишет что добавлено, но остается там только все та же запись, что была добавлена 1й, и размер не изменяется.

Надеюсь на Вашу помощь.

Это класс содержит в себе коллекцию для хранения данных в ведомости, а также статистические методы, предназначенные для добавления данных в коллекцию; вывода данных из ведомости в текстовый файл; ввода их в коллекцию из этого файла; вывода данных из ведомости на консоль.

    package lr7;
    import java.io.*;
    import java.util.*;
public class DataManager {
    private static TreeSet<Energy> lst=new TreeSet<Energy>();
    public static String delimeter = "/";
static boolean tryParseInt(String value) {
        try {
            Integer.parseInt(value);
            return true;
        } catch (NumberFormatException e) {
            return false;
        }
    }
    static boolean tryParseDouble(String value) {
        try {
            Double.parseDouble(value);
            return true;
        } catch (NumberFormatException e) {
            return false;
        }
    }
    public static void Add() {
        Scanner sc = new Scanner(System.in);
        String plant, test;
        double cons_plan = 0;
        double cons_fact = 0;
        System.out.println("Новая запись:");
        System.out.print("Введите название завода:");
        plant = sc.nextLine();
        System.out.print("Введите потребление энергии за планом:");
        while (cons_plan == 0) {
            test = sc.nextLine();
            if (tryParseDouble(test) && Double.parseDouble(test) > 0)
                cons_plan = Integer.parseInt(test);
            else
                System.out.println("Ошибка! Введите положительное число число!");
        }
        System.out.print("Введите потребление энергии фактично:");
        while (cons_fact == 0) {
            test = sc.nextLine();
            if (tryParseDouble(test) && Double.parseDouble(test) > 0)
                cons_fact = Integer.parseInt(test);
            else
                System.out.println("Ошибка! Введите положительное число число!");
        }
        lst.add(new Energy(plant, cons_plan, cons_fact));
        System.out.println("Завод успешно добавлен! \n");
    }
    public static int Delete() {
        Scanner sc = new Scanner(System.in);
        System.out.println("Введите номер записи для удаления > ");
        int position = sc.nextInt();
        if(lst.isEmpty() || position > lst.size()) {
            System.out.println("Такой записи нет \uD83D\uDE48");
            return 0;
        }
        lst.remove(--position);
        System.out.println("Запись успешно удалена!");
        return 1;
    }
    public static int Clear() {
        lst.clear();
        System.out.println("Ведомость очищена!");
        return 1;
    }
    //
    //считаем сумму потребление электроэнергии за планом
    public static double calculateSumConsPlan() {
        double sum = 0;
        for (Energy i: lst) {
            sum += i.getCons_plan();
        }
        return sum;
    }
    //считаем сумму фактического потребление электроэнергии
    public static double calculateSumConsFact() {
        double sum = 0;
        for (Energy i: lst){
            sum+= i.getCons_fact();}
        return sum;
    }
    //строим таблицу
    public static void printData()
    {
        if (lst.isEmpty()) {
            System.out.println("Нет данных для печати! Повторите попытку.");
        }
        else
        {
            System.out.println("---------------------------------------------------------------------------");
            System.out.println("|       | Потребление электроэнергии, кВт/час |    Отклонение от плана    |");
            System.out.println("| Завод |-------------------------------------|---------------------------|");
            System.out.println("|       |     за планом    |     фактично     |    в кВт/час  |    в %    |");
            System.out.println("|-------|------------------|------------------|---------------|-----------|");
            System.out.println("|   Z   |         P        |         F        |        O1     |     O2    |");
            System.out.println("|-------|------------------|------------------|---------------|-----------|");
            //выводим наши значения
            for (Energy e : lst)
            {
                System.out.format("|%1$-7s|%2$-18.2f|%3$-18.2f|%4$-15.2f|%5$-11.2f|\n", e.getPlant(), e.getCons_plan(), e.getCons_fact(),
                        e.calculateDeviation(), e.calculateDeviation1());
                System.out.println("|-------------------------------------------------------------------------|");
            }
            System.out.format("|%1$-7s|%2$-18.2f|%3$-18.2f|               |           |\n","Итого", calculateSumConsPlan(), calculateSumConsFact());
            System.out.println("---------------------------------------------------------------------------");
        }
    }
    //
    public static int ReadData() {
        BufferedReader bR;
        Scanner sc = new Scanner(System.in);
        System.out.print("Введите имя файла > ");
        String fileName = sc.next();
        try {
            FileReader fR = new FileReader("C:\\Users\\Егор\\Desktop\\" + fileName);
            bR = new BufferedReader(fR);
        } catch (IOException e) {
            System.out.println("Файл не найден \uD83D\uDE48");
            return 0;
        }
        String line;
        String[] tokens;
        lst.clear();
        try {
            while ((line = bR.readLine()) != null) {
                System.out.println(line);
                tokens = line.split(delimeter);
                lst.add(new Energy(tokens[0], Double.parseDouble(tokens[1]), Double.parseDouble(tokens[2])));
            }
        } catch (IOException e) {
            System.out.println("Ошибка чтения файла \uD83D\uDE33");
            return 0;
        }
        System.out.println("Файл открыт!");
        return 1;
    }
    public static int WriteData() {
        BufferedWriter bW;
        Scanner sc = new Scanner(System.in);
        System.out.print("Сохранить как > ");
        String path = sc.next();
        try {
            FileWriter fW = new FileWriter("C:\\Users\\Егор\\Desktop\\" + path);
            bW = new BufferedWriter(fW);
        } catch (IOException e) {
            System.out.println("Ошибка создания файла \uD83D\uDE33");
            return 0;
        }
        for (Energy item: lst
        ) {
            try {
                bW.write(item.getPlant() + delimeter + item.getCons_plan() + delimeter + item.getCons_fact());
                bW.newLine();
            } catch (IOException e) {
                System.out.println("Ошибка сохранения \uD83D\uDE33");
                return 0;
            }
        }
        try {
            bW.close();
        } catch (IOException e) {
            return 0;
        }
        System.out.println("Данные добавлены в файл!");
        return 1;
    }
}`

Этот класс предназначен для описания любой из записи ведомости:

    package lr7;
import java.lang.String;
public class Energy implements Comparable<Energy>{
    // Поля
    private String plant;
    private double cons_plan,cons_fact;
    private double devidation, devidation1;
    //Конструктор
    public Energy(String plant, double cons_plan, double cons_fact) {
        this.plant = plant;
        this.cons_plan = cons_plan;
        this.cons_fact = cons_fact;
        this.devidation = this.calculateDeviation();
        this.devidation1 = this.calculateDeviation1();
    }
    //--------------------Методы start---------------------
    //название завода
    public String getPlant() {return plant;}
    //потребление электроэнергии за планом
    public double getCons_plan() {
        return cons_plan;
    }
    //фактическое потребление электроэнергии
    public double getCons_fact() {
        return cons_fact;
    }
    //Отклонение от плана в кВт/час
    public double calculateDeviation() {
        return cons_plan-cons_fact;
    }
    //Отклонение от плана в %
    public double calculateDeviation1() {
        return ((cons_plan-cons_fact)*(100/cons_plan));
    }
    @Override
    public int compareTo(Energy o) {
        return 0;
    }
//--------------------Методы end---------------------
}

Это класс, содержащий главный метод программы:

    package lr7;
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String command;
        label:
        while (true) {
            System.out.println("Чтобы добавить данные о новом заводе введите \"1\"");
            System.out.println("Чтобы вывести данные на экран введите \"2\"");
            System.out.println("Чтобы записать данные в файл введите \"3\"");
            System.out.println("Чтобы считать данные с файла введите \"4\"");
            System.out.println("Чтобы удалить запись введите \"5\"");
            System.out.println("Чтобы очистить все данные введите \"6\"");
            System.out.println("Чтобы выйти программы введите \"0\":");
            command = sc.nextLine();
            switch (command) {
                case "1":
                    DataManager.Add();
                    break;
                case "2":
                    DataManager.printData();
                    break;
                case "3":
                    DataManager.WriteData();
                    break;
                case "4":
                    DataManager.ReadData();
                    break;
                case "5":
                    DataManager.Delete();
                    break;
                case "6":
                    DataManager.Clear();
                    break;
                case "0":
                    break label;
                default:
                    System.out.println("Неизвестная команда!");
                    break;
            }
        }
    }
}
Answer 1

Set - это коллекция, которая содержит уникальные объекты. То есть добавляя в Set очередной элемент выполняется проверка, есть ли там уже такой элемент. В TreeSet уникальность определяется с помощью интерфейса Comparable, который содержит метод compareTo. Вы добавляете первый элемент в пустой Set - элемент успешно добавляется. Пытаетесь добавить второй, при добавлении вызывается compareTo для сравнения с уже добавленным элементом, а ваш compareTo возвращает всегда 0. То есть для вашего TreeSet абсолютно всё объекты Energy равны. Вам нужно корректно реализовать compareTo и всё будет хорошо.

документация TreeSet

READ ALSO
падает база с различными ошибками

падает база с различными ошибками

проблема в следующем-мне нужно два метода один запрос в базу без возращения Resultset,второй с возвращениемоба эти метода постоянно используются...

126
Регистрация ресурсов и пакетов в Jersey

Регистрация ресурсов и пакетов в Jersey

Jersey который я использую, реализован на спецификации JAX-RS 2x

145