Java поиск по переменной дочернего класса, по дочернему классу
Есть программа, в которой есть несколько классов - типов програмного обеспечения. (Freeware, Shareware, CommercialSoftware). Для всех родительский абстрактный класс - Software Данные классов берутся из файла и добавляются в различные классы в зависимости от длины строки в файле(длины массива). Конструкторы классов:
public Software(String name) {
this.name = name;
}
public FreeWare(String name, String producer, LocalDate installationDate) {
super(name);
this.producer = producer;
this.installationDate = installationDate;
}
public ShareWare(String name, String producer, LocalDate installationDate, LocalDate dateOfUseEnding ) {
super(name, producer, installationDate);
this.dateOfUseEnding=dateOfUseEnding;
}
public CommercialSoftware(String name, String producer, LocalDate installationDate, LocalDate dateOfUseEnding, double price) {
super(name, producer, installationDate, dateOfUseEnding);
this.price=price;
}
Все объекты этих классов добавляются в такой список:
public static List<Software> softwares = new ArrayList();
Вот таким образом:
static{
try {
Scanner scanner = new Scanner(new FileReader("software.csv"));
String title = scanner.nextLine();
while(scanner.hasNext()){
String[] line = scanner.nextLine().split(";");
int arrayLength = line.length;
if(arrayLength==3){
LocalDate installationDate = LocalDate.parse(line[2]);
FreeWare freeWare = new FreeWare(line[0],line[1],installationDate);
softwares.add(freeWare);
}else if(arrayLength==4){
LocalDate installationDate = LocalDate.parse(line[2]);
LocalDate useEndDate = LocalDate.parse(line[3]);
ShareWare shareWare = new ShareWare(line[0],line[1],installationDate,useEndDate);
softwares.add(shareWare);
}else if(arrayLength==5){
LocalDate installationDate = LocalDate.parse(line[2]);
LocalDate useEndDate = LocalDate.parse(line[3]);
CommercialSoftware commercialSoftware = new CommercialSoftware(line[0],line[1],installationDate,useEndDate,Double.parseDouble(line[4].replace(',','.')));
softwares.add(commercialSoftware);
}else{
System.out.println("ERROR!");
}
}
} catch (FileNotFoundException ex) {
System.out.println(ex.getMessage());
}
}
Мне нужно осуществить поиск по этому списку. Поиск по имени не составил проблем, так как данная переменная есть в главном классе.
Вопрос 1: Мне нужно сделать поиск по производителю(producer), но этой переменной нет в главном классе, который является типом данных для списка. Как это сделать?
Вопрос 2: Нужно сделать поиск по типу софта. Как сделать поиск по названию дочернего класса, чтобы не добавлять лишнюю переменную для типа софта.
Пример поиска:
//poisk po chasti nazvanija
public static List<Software> searchByPartOfTheName(String partOfTheName){
List<Software> search = new ArrayList();
for(Software soft:softwares){
if(soft.getName().contains(partOfTheName))
{
search.add(soft);
}
return search;
}
Ответы (1 шт):
У вас список softwares
Если проверять тип каждого элемента
if(software instanceof FreeWare){...}
Можно перебирать и находить обратно то что добавили в список. Почитайте подробнее об instanceof
Не большой пример
package test;
import java.util.ArrayList;
import java.util.List;
abstract class Software {}
class FreeSoftware extends Software {
Boolean free = true;
}
class ShareWareSoftware extends Software {
Boolean shareWare = true;
}
class CommercialSoftware extends Software {
Boolean commercial = true;
}
public class App {
// Driver code
public static void main(String args[]) {
List<Software> softwares = new ArrayList<Software>();
softwares.add(new FreeSoftware());
softwares.add(new ShareWareSoftware());
softwares.add(new ShareWareSoftware());
softwares.add(new CommercialSoftware());
for (Software software : softwares) {
if (software instanceof FreeSoftware) {
System.out.println(((FreeSoftware) software).free);
if (software.getClass().getName().contains("FreeSoftware")) {
System.out.println(software.getClass().getName());
}
}
if (software instanceof ShareWareSoftware) {
System.out.println(((ShareWareSoftware) software).shareWare);
if (software.getClass().getName().contains("ShareWareSoftware")) {
System.out.println(software.getClass().getName());
}
}
if (software instanceof CommercialSoftware) {
System.out.println(((CommercialSoftware) software).commercial);
if (software.getClass().getName().contains("CommercialSoftware")) {
System.out.println(software.getClass().getName());
}
}
}
}
}