2015-01-07 69 views
-1

我有成绩,考试科目以及多年的清单,但我想让它,所以它会检查是否有品位已经针对特定的主题和一年了,我不能弄清楚如何在列表中搜索它。搜索,如果特定元素已经在一个ArrayList中

public List<Nota> notas; 
public Double notaMedia; 

//Constructor 
public ExpedienteImpl() { 
    this.notas = new ArrayList<Nota>(); 
    this.notaMedia = getNotaMedia(); 
} 

private void checkNota(Integer cursoAcademico, TipoConvocatoria tipoConvocatoria, Asignatura asignatura){ 
    if (this.notas.contains()){ 

    } 
} 

像这样的事情是我做了什么,但只有包含了一个对象(?)的作品,我想寻找是否有什么在诺塔领域对于一个给定cursoAcademico,tipoConvocatoria和asignatura(当然, 学科)。

诺塔代码:

public interface Nota { 

Asignatura getAsignatura(); 

Integer getCursoAcademico(); //Dado por el primer año del curso, eg: 2014/15 -> 2014 

TipoConvocatoria getTipoConvocatoria(); //Primero, segundo o tercero 

Double getValorNota(); 
TipoNota getTipoNota(); //0-5 Supenso, 5-7 Aprobado, 7-9 Notable, 9-10 Sobresaliente, 9-10 + mención = Matrícula de Honor, 
Boolean getMencionHonor(); 


} 

public class NotaImpl implements Nota { 

//Atributos 
private Integer cursoAcademico; 
private TipoConvocatoria tipoConvocatoria; 
private Double valorNota; 
private TipoNota tipoNota; 
private Boolean mencionHonor; 
private Asignatura asignatura; 

//Constructores 
public NotaImpl(Asignatura asignatura, Integer cursoAcademico, TipoConvocatoria tipoConvocatoria, Double valorNota, TipoNota tipoNota, Boolean mencionHonor) { 
    checkerNumero(valorNota); 
    checkerMencion(mencionHonor, valorNota); 
    this.cursoAcademico = cursoAcademico; 
    this.tipoConvocatoria = tipoConvocatoria; 
    this.tipoNota = tipoNota; 
    this.valorNota = valorNota; 
    this.mencionHonor = mencionHonor; 
} 

不知道,如果你需要更多。

+1

请发表'Nota'的代码。 –

+2

我不知道'HashList'是什么。 – chrylis

+0

你的'Nota'类有哪些字段和方法? –

回答

0

您在列表中有环路,获取对象并进行比较。 最简单的方法是用标记等创建一个nota对象。 重写Nota的equals方法。

现在, 使用contais检查,如果它提出。

import java.util.ArrayList; 
import java.util.List; 

public class ExpedienteImpl { 

    public List<Nota> notas; 
    public Double notaMedia; 

    //Constructor 
    public ExpedienteImpl() { 
     this.notas = new ArrayList<Nota>(); 
     this.notaMedia = getNotaMedia(); 
    } 

    private Double getNotaMedia() { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    private void checkNota(Integer cursoAcademico, TipoConvocatoria tipoConvocatoria, Asignatura asignatura){ 
     Nota objNota = new NotaImpl(asignatura, cursoAcademico, tipoConvocatoria, 0.0, null, null); 
     if(notas.contains(objNota)){ 
       System.out.println("Nota matched"); 
     } 
    } 

} 

interface Nota { 

Asignatura getAsignatura(); 

Integer getCursoAcademico(); //Dado por el primer año del curso, eg: 2014/15 -> 2014 

TipoConvocatoria getTipoConvocatoria(); //Primero, segundo o tercero 

Double getValorNota(); 
TipoNota getTipoNota(); //0-5 Supenso, 5-7 Aprobado, 7-9 Notable, 9-10 Sobresaliente, 9-10 + mención = Matrícula de Honor, 
Boolean getMencionHonor(); 


} 

class NotaImpl implements Nota { 

//Atributos 
private Integer cursoAcademico; 
private TipoConvocatoria tipoConvocatoria; 
private Double valorNota; 
private TipoNota tipoNota; 
private Boolean mencionHonor; 
private Asignatura asignatura; 

//Constructores 
public NotaImpl(Asignatura asignatura, Integer cursoAcademico, TipoConvocatoria tipoConvocatoria, Double valorNota, TipoNota tipoNota, Boolean mencionHonor) { 
    checkerNumero(valorNota); 
    checkerMencion(mencionHonor, valorNota); 
    this.cursoAcademico = cursoAcademico; 
    this.tipoConvocatoria = tipoConvocatoria; 
    this.tipoNota = tipoNota; 
    this.valorNota = valorNota; 
    this.mencionHonor = mencionHonor; 
} 

private void checkerMencion(Boolean mencionHonor2, Double valorNota2) { 
    // TODO Auto-generated method stub 

} 

private void checkerNumero(Double valorNota2) { 
    // TODO Auto-generated method stub 

} 

@Override 
public Asignatura getAsignatura() { 
    return null; 
} 

@Override 
public Integer getCursoAcademico() { 
    // TODO Auto-generated method stub 
    return null; 
} 

@Override 
public TipoConvocatoria getTipoConvocatoria() { 
    // TODO Auto-generated method stub 
    return null; 
} 

@Override 
public Double getValorNota() { 
    // TODO Auto-generated method stub 
    return null; 
} 

@Override 
public TipoNota getTipoNota() { 
    // TODO Auto-generated method stub 
    return null; 
} 

@Override 
public Boolean getMencionHonor() { 
    // TODO Auto-generated method stub 
    return null; 
} 

public boolean equals(Nota nota){ 
    if(this.getCursoAcademico().equals(nota.getCursoAcademico())) 
     return true; 
    return false; 
} 
} 


class Asignatura{ 
} 

class TipoConvocatoria{ 

} 

class TipoNota{ 

} 

以如果满足您的平等标准的方式更新equals方法。

+0

因此,我可以用我想要比较的对象创建一个“小列表”,然后循环遍历另一个列表并每次使用equals。感谢您的帮助。 –

+1

如果他根据自己的要求实现等于,为什么迭代列表?包含方法将工作得很好。 – Stultuske

+0

@BrickTop你不需要另一个列表。只是一个临时的比较对象,你不需要自己迭代它。改用'List#contains'。 – Tom

0

您可以通过整个列表,然后移动比较帕拉姆每个对象的领域。

+0

重点不在于迭代List,只是通过调用方法(如)包含。 – Stultuske

0

如果您使用Java 8 Stream API:s可能在这里使用。

// Filter out all Nota-objects that match the provided input 
// and store them in a list 
final List<Nota> filtered = this.notas.stream() 
    .filter(nota -> { 
     return nota.getCursoAcademico().equals(cursoAcademico) && 
       nota.getTipoConvocatoria().equals(tipoConvocatoria) && 
       nota.getAsignatura().equals(asignatura); 
    }) 
    .collect(Collectors.toList()); 

// Or, count the number of matching objects 
final long count = this.notas.stream() 
    .filter(nota -> { 
     return nota.getCursoAcademico().equals(cursoAcademico) && 
       nota.getTipoConvocatoria().equals(tipoConvocatoria) && 
       nota.getAsignatura().equals(asignatura); 
    }) 
    .count(); 

这样就可以过滤掉你的比赛提供了TipoConvocatoriaAsignatura有equals方法。

您可以了解更多关于流here,你可以特别检查出filter - 方法。

0

在C#中,这将是:

public class Grade{ 
    public int Mark { get; set; } 
    public string Subject { get; set; } 
    public int Year { get; set; } 
} 

现在让我们说你有一些数据

var grades = new List<Grade>() 
{ 
    new Grade() {Mark = 3, Subject = "Calculus II", Year = 2015}, 
    new Grade() {Mark = 2, Subject = "Calculus II", Year = 2014} 
}; 
var grade = new Grade() {Mark = 10, Subject = "Calculus II", Year = 2015}; 

如果你想检查等级,具有相同的主题和年度存在,你可以这样写:

if (!grades.Any(o => o.Subject == grade.Subject && o.Year == grade.Year)) 
{//does not exists - add 
    grades.Add(grade); 
} 
else 
{//exists 

} 

在Java 1.4,1.5,6,7,你没有拉姆达的,写这将是因为它有点麻烦需要相当多的样板代码。然而,正式名称为Google Collections的Google Guava,增加了对java 6的支持(它曾经是Java 1.5的版本,但不知道atm)。还有一种称为Appache Collections的替代方法,大部分情况下做同样的事情有点不同。

在任何情况下,你写

Predicate<Integer> isEven = new Predicate<Grade>() { 
    @Override public boolean apply(Grade item) { 
     return item.Subject == grade.Subject && item.Year == grade.Year; 
    }    
}; 
if (Iterables.filter(grades, isEven).isEmpty()) 
{//does not exists - add 
    grades.Add(grade); 
} 
else 
{//exists 

} 

这侵犯Java中的匿名函数变量范围的知名度,但它是非常干净,易于阅读,具有出色的性能,并应努力达到的Java 1.5。如果iterables不具有。isEmpty(),则它与大致相同。大小()< = 0。 (可惜我没有因为编写Java而得到报酬,所以没有开发环境准备检查,这只是从内存写入)。