Использую коллекцию 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;
}
}
}
}
Set
- это коллекция, которая содержит уникальные объекты. То есть добавляя в Set
очередной элемент выполняется проверка, есть ли там уже такой элемент. В TreeSet
уникальность определяется с помощью интерфейса Comparable
, который содержит метод compareTo
.
Вы добавляете первый элемент в пустой Set
- элемент успешно добавляется. Пытаетесь добавить второй, при добавлении вызывается compareTo
для сравнения с уже добавленным элементом, а ваш compareTo
возвращает всегда 0. То есть для вашего TreeSet
абсолютно всё объекты Energy
равны. Вам нужно корректно реализовать compareTo
и всё будет хорошо.
документация TreeSet
проблема в следующем-мне нужно два метода один запрос в базу без возращения Resultset,второй с возвращениемоба эти метода постоянно используются...
Есть две сущности:
Jersey который я использую, реализован на спецификации JAX-RS 2x