2015-01-07 107 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而得到報酬,所以沒有開發環境準備檢查,這只是從內存寫入)。