OSDN Git Service

単語抽出の向上
[chnosproject/CHNOSProject.git] / CHNOSProject / chn / chnlib00.c
index d3d0fa6..7f3990a 100755 (executable)
@@ -57,6 +57,7 @@ CHNLIB_UIPArray *CHNLIB_UIPArray_Initialize(void)
 \r
 int CHNLIB_UIPArray_AppendLast(CHNLIB_UIPArray **array, uint data32, void *pointer)\r
 {\r
+    //戻り値:追加されたタグのIndex\r
     //Arrayの末尾にデータを追加する。\r
     int index;\r
     \r
@@ -77,22 +78,20 @@ int CHNLIB_UIPArray_AppendLast(CHNLIB_UIPArray **array, uint data32, void *point
 \r
 int CHNLIB_UIPArray_AppendLast_ProtectFromDuplication(CHNLIB_UIPArray **array, uint data32, void *pointer, int (*IsDuplicated)(const void *listtag, const void *newtag))\r
 {\r
-    //戻り値:IsAdded(True/False)\r
+    //戻り値:追加されたタグ、もしくは重複する既存のタグのIndex\r
     //int (*IsDuplicated)(void *listtag, void *newtag)は、重複を確認する関数へのポインタ。\r
-    //listtagã\81«arrayã\81®ã\81\99ã\81¹ã\81¦ã\81®pointerã\82\92ä¸\8eã\81\88ã\80\81ã\81\99ã\81¹ã\81¦ã\81\8cFalseã\81 ã\81£ã\81\9få ´å\90\88追å\8a ã\81\97ã\81¦Falseã\82\92è¿\94ã\81\99\r
-    //Trueã\81\8cè¿\94ã\81£ã\81\9fæ\99\82ç\82¹ã\81§ã\80\81追å\8a ã\82\92ã\81\9bã\81\9aTrueを返す。\r
+    //listtagã\81«arrayã\81®ã\81\99ã\81¹ã\81¦ã\81®pointerã\82\92ä¸\8eã\81\88ã\80\81ã\81\99ã\81¹ã\81¦ã\81\8cFalseã\81 ã\81£ã\81\9få ´å\90\88追å\8a ã\81\99ã\82\8b\r
+    //Trueã\81\8cè¿\94ã\81£ã\81\9fæ\99\82ç\82¹ã\81§ã\80\81追å\8a ã\82\92ã\81\97ã\81ªã\81\84ã\81§æ\97¢å­\98ã\81®ã\82¿ã\82°ã\81«å¯¾ã\81\99ã\82\8bIndexを返す。\r
     int i, i_max;\r
     \r
     i_max = CHNLIB_UIPArray_GetNumberOfDatas(*array);\r
     for(i = 0; i < i_max; i++){\r
         if(IsDuplicated(CHNLIB_UIPArray_GetPointerByIndex(*array, i), pointer)){\r
-            return False;\r
+            return i;\r
         }\r
     }\r
     \r
-    CHNLIB_UIPArray_AppendLast(array, data32, pointer);\r
-    \r
-    return True;\r
+    return CHNLIB_UIPArray_AppendLast(array, data32, pointer);\r
 }\r
 \r
 int CHNLIB_UIPArray_RemoveByIndex(CHNLIB_UIPArray **array, int index)\r
@@ -207,7 +206,7 @@ void CHNLIB_UIPArray_FreeAll(CHNLIB_UIPArray **array)
 \r
 void CHNLIB_UIPArray_FreeSelectedAll(CHNLIB_UIPArray **array)\r
 {\r
-    //Array及びdata32==TrueのPointerをFree.\r
+    //Array及びdata32==FalseのPointerをFree.\r
     CHNLIB_UIPArray_FreeOnlySelectedPointer(*array);\r
     CHNLIB_UIPArray_FreeOnlyArray(array);\r
     return;\r
@@ -276,6 +275,12 @@ void *CHNLIB_UIPArray_GetPointerByIndex(const CHNLIB_UIPArray *array, int index)
     return array->tag[index].pointer;\r
 }\r
 \r
+void *CHNLIB_UIPArray_GetPointerByData32(const CHNLIB_UIPArray *array, uint data32)\r
+{\r
+    //指定されたdata32を持つindexのデータのPointerを返す。\r
+    return CHNLIB_UIPArray_GetPointerByIndex(array, CHNLIB_UIPArray_GetIndexByData32(array, data32));\r
+}\r
+\r
 int CHNLIB_UIPArray_GetIndexByData32(const CHNLIB_UIPArray *array, uint data32)\r
 {\r
     //指定されたdata32を持つ最小のIndexを返す。\r
@@ -290,10 +295,61 @@ int CHNLIB_UIPArray_GetIndexByData32(const CHNLIB_UIPArray *array, uint data32)
     return CHNLIB_UIPArray_INDEX_NOTFOUND;\r
 }\r
 \r
-void *CHNLIB_UIPArray_GetPointerByData32(const CHNLIB_UIPArray *array, uint data32)\r
+CHNLIB_UIPArray *CHNLIB_UIPArray_CopyArray(const CHNLIB_UIPArray *source)\r
 {\r
-    //指定されたdata32を持つindexのデータのPointerを返す。\r
-    return CHNLIB_UIPArray_GetPointerByIndex(array, CHNLIB_UIPArray_GetIndexByData32(array, data32));\r
+    //sourceと等価な配列を新たに生成して返す。\r
+    CHNLIB_UIPArray *destination;\r
+    int i, i_max;\r
+    \r
+    destination = CHNLIB_UIPArray_Initialize();\r
+    i_max = CHNLIB_UIPArray_GetNumberOfDatas(source);\r
+    \r
+    for(i = 0; i < i_max; i++){\r
+        CHNLIB_UIPArray_AppendLast(&destination, CHNLIB_UIPArray_GetData32ByIndex(source, i), CHNLIB_UIPArray_GetPointerByIndex(source, i));\r
+    }\r
+    \r
+    return destination;\r
+}\r
+\r
+CHNLIB_UIPArray *CHNLIB_UIPArray_SortInDescendingOrderByData32(const CHNLIB_UIPArray *array)\r
+{\r
+    //タグをData32の値で降順(大きい方から小さい方)になるように整列した新たなArrayを返す。\r
+    CHNLIB_UIPArray *sorted, *temp;\r
+    int i, i_max;\r
+    int candidateIndex, candidateData32, currentData32;\r
+    \r
+    sorted = CHNLIB_UIPArray_Initialize();\r
+    temp = CHNLIB_UIPArray_CopyArray(array);\r
+    i_max = CHNLIB_UIPArray_GetNumberOfDatas(temp);\r
+    \r
+    for(i = 0; i < i_max; i++){\r
+        //tempのData32に1を足す(0を追加済みとマークするため)。\r
+        CHNLIB_UIPArray_SetData32ByIndex(temp, i, CHNLIB_UIPArray_GetData32ByIndex(temp, i) + 1);\r
+    }\r
+    \r
+    for(;;){\r
+        candidateData32 = 0;\r
+        for(i = 0; i < i_max; i++){\r
+            currentData32 = CHNLIB_UIPArray_GetData32ByIndex(temp, i);\r
+            if(candidateData32 < currentData32){\r
+                candidateData32 = currentData32;\r
+                candidateIndex = i;\r
+            }\r
+        }\r
+        if(candidateData32 == 0){\r
+            break;\r
+        }\r
+        for(i = candidateIndex; i < i_max; i++){\r
+            currentData32 = CHNLIB_UIPArray_GetData32ByIndex(temp, i);\r
+            if(candidateData32 == currentData32){\r
+                //-1を忘れないように\r
+                CHNLIB_UIPArray_AppendLast(&sorted, currentData32 - 1, CHNLIB_UIPArray_GetPointerByIndex(temp, i));\r
+                CHNLIB_UIPArray_SetData32ByIndex(temp, i, 0);\r
+            }\r
+        }\r
+    }\r
+    \r
+    return sorted;\r
 }\r
 \r
 //\r