Main Content

列挙型の演算

列挙型によってサポートされる演算

列挙型では、論理演算、集合メンバー演算および文字列比較演算を使用できます。これらの演算では、switch ステートメントおよび if ステートメントなどの条件付きステートメントでの列挙型の使用もサポートしています。関数 string および char を使用すると、列挙メンバーを string および char ベクトルに変換できます。

列挙クラスの例

このトピックでは、WeekDays クラスを使用して列挙型で演算を実行する方法を示します。WeekDays クラスは週の曜日を列挙するメンバーを定義します。

classdef WeekDays
   enumeration
      Monday, Tuesday, Wednesday, Thursday, Friday
   end
end

列挙型の定義の詳細については、列挙クラスの定義を参照してください。

既定のメソッド

列挙クラスには以下の既定のメソッドがあります。

methods('WeekDays')
Methods for class WeekDays:

WeekDays   char       intersect  ne         setxor     strcmpi    strncmp    union      
cellstr    eq         ismember   setdiff    strcmp     string     strncmpi 

WeekDays メソッドはテキスト形式を列挙形式に変換します。サポートされる形式には、string、char ベクトル、string 配列、および char ベクトルの cell 配列が含まれます。以下に例を示します。

f = WeekDays(["Monday" "Friday"])
f = 

  1×2 WeekDays enumeration array

    Monday    Friday

列挙メンバーを string または char ベクトルに変換

列挙メンバーから string および char ベクトルへの変換は、列挙メンバー名を含むテキストを作成するのに役立ちます。たとえば、関数 string を使用して列挙メンバーを string に変換し、それを文に含めます。

string(WeekDays.Monday) + " is our meeting day."
ans = 

    "Monday is our meeting day."

同様の方法で、関数 char を使用します。

['Today is ' char(WeekDays.Friday) '.']
ans =

    'Today is Friday.'

列挙配列を string 配列または char ベクトルの cell 配列に変換

関数 string を使用して、列挙配列を string 配列に変換します。

sa = [WeekDays.Tuesday WeekDays.Thursday];
string(sa)
ans = 

  1×2 string array

    "Tuesday"    "Thursday"

cellstr を使用して、列挙配列を char ベクトルの cell 配列に変換します。

ca = cellstr([WeekDays.Tuesday WeekDays.Thursday]);
class(ca)
ans =

    'cell'

cell 配列の両方のセルに char ベクトルが含まれています。

class([ca{1:2}])
ans =

    'char'

列挙値、string、char ベクトルを使用した関係演算

関係演算子 eq (==) と ne (~=)、および isequal メソッドを使用して、列挙型インスタンスを char ベクトルおよび string と比較できます。

関係演算子 eq および ne

eq および ne を使用して、列挙メンバーとテキスト値を比較します。たとえば、次のように列挙メンバーと string を比較できます。

today = WeekDays.Friday;
today == "Friday"
ans =

  logical

   1

列挙配列を 1 つの char ベクトルと比較します。戻り値は、列挙配列のどのメンバーが char ベクトルと等価であるかを示す logical 配列です。

wd = [WeekDays.Monday WeekDays.Wednesday WeekDays.Friday];
wd == 'Friday'
ans =

  1×3 logical array

   0   0   1

この例では、関数 ne を使用して、同じ長さの列挙配列および string 配列の対応する要素を比較します。

sa = ["Monday" "Wednesday" "Friday"];
md = [WeekDays.Tuesday WeekDays.Thursday WeekDays.Friday];
md ~= sa
ans =

  1×3 logical array

   1   1   0

char ベクトル Wednesday は列挙メンバー WeekDays.Wednesday と等価 (==) です。この等価性を条件付きステートメントで使用できます。

today = 'Wednesday';
   ...
if today == WeekDays.Wednesday
   disp('Team meeting at 2:00')
end

isequal メソッド

isequal メソッドを使用すると、列挙インスタンスと string、文字ベクトル、string 配列、および文字ベクトルの cell 配列を比較することもできます。

a = WeekDays.Monday;
isequal(a,"Monday")
ans =

     logical

     1

列挙配列を単一項目と比較する場合、isequal の動作は eq および ne とわずかに異なります。isequal メソッドでは、比較される 2 つの値のサイズが同じでなければなりません。そのため、列挙配列を char ベクトルまたは string スカラーと比較するときは、テキストが配列内の列挙メンバーのいずれかと一致する場合でも、isequal は false を返します。

wd = [WeekDays.Monday WeekDays.Wednesday WeekDays.Friday];
isequal(wd,"Friday")
ans =

     logical

     0

switch ステートメント内の列挙型

等式関数 (eq) と不等式関数 (ne) により、switch ステートメントで列挙メンバーを使用できます。たとえば、前に定義した WeekDays 列挙型を使用して、switch ステートメントを作成します。

function c = Reminder(day)
   % Add error checking here
   switch(day)
      case WeekDays.Monday
         c = 'No meetings';
      case WeekDays.Tuesday
         c = 'Department meeting at 10:00';
      case {WeekDays.Wednesday WeekDays.Friday}
         c = 'Team meeting at 2:00';
      case WeekDays.Thursday
         c = 'Volleyball night';
   end
end

WeekDays 列挙クラスのメンバーを関数 Reminder に渡します。

today = WeekDays.Wednesday;
Reminder(today)
ans =

Team meeting at 2:00

詳細については、条件付きステートメント内のオブジェクトを参照してください。

string または char ベクトルの置換

string または char ベクトルを使用して、特定の列挙メンバーを表すことができます。

function c = Reminder2(day)
   switch(day)
      case 'Monday'
         c = 'Department meeting at 10:00';
      case 'Tuesday'
         c = 'Meeting Free Day!';
      case {'Wednesday' 'Friday'}
         c = 'Team meeting at 2:00';
      case 'Thursday'
         c = 'Volleyball night';
   end
end

列挙型を明示的に指定するのではなく char ベクトルまたは string を使用することができますが、MATLAB® はテキスト形式を列挙型に変換しなければなりません。必要がない場合は、この変換が行われないようにしてください。

列挙型集合メンバー

列挙クラスには集合メンバーの判定を行うメソッドが用意されています。

  • ismember — 列挙配列の要素が集合内にある場合、true

  • setdiff — 列挙配列の差集合

  • intersect — 列挙配列の積集合

  • setxor — 列挙配列の排他的論理和

  • union — 列挙配列の和集合

今日がチームのミーティング日であるかどうかを調べます。チームのミーティング日に対応する列挙メンバーのセットを作成します。

today = WeekDays.Tuesday;
teamMeetings = [WeekDays.Wednesday WeekDays.Friday];

ismember を使用して、todayteamMeetings 集合の一部であるかどうかを判定します。

ismember(today,teamMeetings)
ans = 
     0

列挙型とテキストの混在集合

列挙メンバーとテキスト値の両方を列挙クラス メソッドに渡すと、クラスはテキスト値を列挙のクラスに変換しようとします。

char ベクトル 'Friday' が列挙配列のメンバーであるかどうかを判定します。

teamMeetings = [WeekDays.Wednesday WeekDays.Friday];
ismember('Friday',teamMeetings)
ans =

  logical

   1

列挙メンバーが string 配列のメンバーであるかどうかを判定します。

ismember(WeekDays.Friday,["Wednesday" "Friday"])
ans =

  logical

   1

列挙型テキストの比較メソッド

列挙クラスには、列挙メンバーとテキストを比較するメソッドが用意されています。文字列比較メソッドの引数の 1 つは char ベクトルまたは string でなければなりません。2 つの列挙メンバーを比較すると false が返されます。

  • strcmp — 列挙メンバーを比較する

  • strncmp — 列挙メンバーの最初の n 文字を比較する

  • strcmpi — 大文字と小文字を区別せずに列挙メンバーを比較する

  • strncmpi — 大文字と小文字を区別せずに列挙メンバーの最初の n 文字を比較する

列挙メンバーと string または char ベクトルの比較

文字列比較メソッドは、列挙メンバーと char ベクトルおよび string を比較できます。

today = WeekDays.Tuesday;
strcmp(today,'Friday')
ans =

     0
strcmp(today,"Tuesday")
ans =

     1

列挙型に関する情報の取得

関数 enumeration を使用して、列挙クラスについての情報を取得します。以下に例を示します。

enumeration WeekDays
Enumeration members for class 'WeekDays':

    Monday
    Tuesday
    Wednesday
    Thursday
    Friday

クラス イントロスペクションによる列挙値の処理方法の詳細については、メタクラス EnumeratedValues プロパティを参照してください。

列挙型のテスト

値が列挙であるかどうかを判定するには、関数 isenum を使用します。以下に例を示します。

today = WeekDays.Wednesday;
isenum(today)
ans =

     1

isenum は空の列挙オブジェクトに対して true を返します。

noday = WeekDays.empty;
isenum(noday)
ans =

     1

クラスが列挙クラスであるかどうかを判定するには、matlab.metadata.Class オブジェクトを使用します。

today = WeekDays.Wednesday;
mc = metaclass(today);
mc.Enumeration
ans =

     1

関連するトピック