【问题标题】:Java List Duplicate [closed]Java列表重复[关闭]
【发布时间】:2020-01-03 21:05:31
【问题描述】:

我有这种打印专业列表的方法,在这些条件下,我不能重复使用专业名称。 我希望创建另一个不让我拥有超过 3 个类别的条件,即医学、护士、助理。

public void RegistarProfissional(List<Profissional> rProfissional, String nomeP, String categoriaP) {
    int i = 0;
    for (; i < rProfissional.size(); i++) {
        if (rProfissional.get(i).nomeP.equals(nomeP)) {
            System.out.println("Existing Professional, error.");
            break;
        }

        if (i == rProfissional.size()) {
            rProfissional.add(new Profissional(nomeP, categoriaP));
            System.out.println("Professional registered");
        }
    }
}

【问题讨论】:

  • 我看不出这里有什么问题。
  • 您可能希望对类别使用enumerated type,而不是字符串。
  • @SephB 我破译了它,但他更多的是要求我们编写额外的要求,而不是修复他当前发布的任何内容。他想添加另一个条件来检查 List 当前是否有超过 3 个类别,而新的“专业”是第 4 个不同的类别,不要将其添加到列表中,而是会出错。
  • 我想创建另一个条件,当我在其列表中插入 categoriaP 对象时,它不能超过我在其中写入的 3 个值。
  • 我尝试了很多方法,但没有一个有效

标签: java class object methods


【解决方案1】:

(调整你的英语术语)

验证规则

听起来您正在尝试验证现有列表中的数据。您的验证规则似乎有一对标准:

  • Professional 对象列表不能有重复的人名。
  • 每个Professional 对象都必须带有一个profession 属性,该属性具有以下三个值之一:护士、医师、助理。

我们将忽略现实世界中两个人可以同名的实际问题。

我们的Professional 班级。

package work.basil.example;

public class Professional
{
    public String name, category;

    public Professional ( String name , String category )
    {
        this.name = name;
        this.category = category;
    }
}

虚拟数据。

List < Professional > pros = List.of(
        new Professional( "Alice" , "physician" ) ,
        new Professional( "Bob" , "nurse" ) ,
        new Professional( "Carol" , "assistant" ) ,
        new Professional( "David" , "physician" )
);

测试我们的两条规则。

String targetName = "Bob";
String targetCategory = "driver";

// Test for category.
List < String > categories = List.of( "nurse" , "physician" , "assistant" );
if ( ! categories.contains( "targetCategory" ) )
{
    System.out.println( "Validation violation. The category: " + targetCategory + " not found in category list: " + categories );
    return;
}

// Test for duplicate name.
for ( Professional pro : pros )
{
    boolean foundDuplicateName = pro.name.equalsIgnoreCase( targetName );
    if ( foundDuplicateName )
    {
        System.out.println( "Validation violation. Duplicate name found: " + targetName );
        break;
    }
}

我们可以使用 Java Streams 和 lambda 语法来检查重复项。

制作一个列表流。

Stream< Professional > prosStream = pros.stream() ;

对于流生成的每个Professional 对象,应用谓词测试以查看该对象中的名称是否与我们的目标名称匹配。找到第一个匹配项后,将返回 Optional&lt; Professional &gt;。如果我们用isPresent检查那个Optional对象,我们会得到true。如果没有找到匹配项,将返回一个空的OptionalisPresent 返回false

Stream < Professional > prosStream = pros.stream();
boolean foundDuplicateName =
        prosStream
                .filter( ( Professional pro ) -> pro.name.equalsIgnoreCase( targetName ) )
                .findFirst()
                .isPresent()
;
if ( foundDuplicateName )
{
    System.out.println( "Validation violation. Duplicate name found: " + targetName );
    return;
}

我们可以简化流工作。方法Stream::anyMatch也有同样的效果。

Stream < Professional > prosStream = pros.stream();
boolean foundDuplicateName =
        prosStream
                .anyMatch( ( Professional pro ) -> pro.name.equalsIgnoreCase( targetName ) )
;
if ( foundDuplicateName )
{
    System.out.println( "Validation violation. Duplicate name found: " + targetName );
    return;
}

我们可以将其简化为单行。

if (  pros.stream().anyMatch( ( Professional pro ) -> pro.name.equalsIgnoreCase( targetName ) ) )
{
    System.out.println( "Validation violation. Duplicate name found: " + targetName );
    return;
}

枚举

您应该使用枚举,而不是仅仅为您的category 值使用字符串。 Java 有一个简单而强大且灵活的枚举工具,比大多数语言都要好得多。见Oracle Tutorial

package work.basil.example;

public enum Category
{
    NURSE , PHYSICIAN , ASSISTANT ;
}

将我们的 Professional 类更改为使用枚举而不是单纯的字符串。

package work.basil.example;

public class Professional
{
    public String name;
    Category category;

    public Professional ( String name , Category category )
    {
        this.name = name;
        this.category = category;
    }
}

像这样实例化:

Professional pro = new Professional( "Alice" , Category.PHYSICIAN ) ;

这将消除您对作为预期值之一的类别的检查验证测试。不会使用 Category 的无效值来实例化 Professional 对象,因为所有可能的值都已定义,并且编译器会检查类型和值。任何诸如此类的尝试都会失败:

  • new Professional ( "Alice" , "driver" ) ➙ 由于类型不匹配导致的编译器错误,第二个参数是 String 对象,其中应该是 Category 枚举对象。
  • new Professional ( "Alice" , Category.DRIVER ) ➙ 无效值导致编译器错误,因为枚举类上没有定义这样的枚举对象 DRIVER

【讨论】:

    【解决方案2】:

    我自己找到的。 只需要在主文件上创建这个条件:

    if(!categoriaP.equals("Medicina") && !categoriaP.equals("Enfermagem") && !categoriaP.equals("Auxiliar")) {
                            System.out.println("Categoria inexistente");
                            continue;
                        }
    

    还是谢谢

    【讨论】:

      猜你喜欢
      • 2018-02-17
      • 1970-01-01
      • 1970-01-01
      • 2015-08-08
      • 2016-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多